Image

Imagealamar wrote in Imageru_java

Category:

Традиционный пятничный Hibernateпост

На этот раз буду краток и без эмоций, потому что сам проблему пока не решил.

Есть у нас такой persistent-класс:
<class name="Attribute" discriminator-value="0">
    <cache usage="nonstrict-read-write" region="my-cache"/>

    <map name="names" lazy="false" fetch="join">
        <cache usage="nonstrict-read-write" region="my-cache"/>
        <key on-delete="cascade" not-null="true"/>
        <map-key column="LANGUAGE_CODE" type="language" length="2"/>
        <composite-element class="Attribute$Names">
            <property name="name" type="text" not-null="true"/>
            <property name="extraInfo" type="text" column="EXTRA_INFO"/>
        </composite-element>
        <filter name="languageFilter" condition=":language = LANGUAGE_CODE"/>
    </map>
</class>

Так вот, проблема в том, что запрос на заполнение этой map вызывается 58480 раз за один прогон программы. При этом в таблице attribute двадцать записей.
Несмотря на lazy="false", fetch="join" - дёргается оно вот так:
select names0_.id as id0_, names0_.name as name0_, names0_.extra_info as extra3_0_, names0_.language_code as language4_0_ from attribute_names names0_ where ? = names0_.LANGUAGE_CODE and names0_.id=?. Пятьдесят восемь тысяч четыреста восемьдесят раз.

В качестве кеша - OSCache, если это важно.
Кеш точно работает - в него кладутся объекты и коллекции, уменьшение их дергания кардинально заметно по количеству запросов.

Вопрос:
- Почему не кешируются эти attribute_names?
- Как сделать, тем или иным способом, чтобы они выдёргивались из базы данных хотя бы на два порядка меньше раз?

UPDATE:
Причина некеширования найдена: если закомментировать <filter>, пятьдесят восемь тысяч четыреста восемьдесят запросов сразу превратятся в 20.
Но теперь вопросов уже три:
- Где в секции документации Chapter 17. Filtering data сказано, что их использование убивает на корню любую надежду на производительность?
- Зачем в Hibernate сделали фильтры, работу которых можно охарактеризовать американскими прилогательными pathetic и miserable?
- Или я что-то до сих пор упускаю, и можно научить его совершать 20 запросов, невзирая на фильтры?

По прежнему очень хотел бы услышать ответ на этот вопрос - не глумления ради, а пользы для.