Традиционный пятничный Hibernateпост
На этот раз буду краток и без эмоций, потому что сам проблему пока не решил.
Есть у нас такой persistent-класс:
Так вот, проблема в том, что запрос на заполнение этой 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 запросов, невзирая на фильтры?
По прежнему очень хотел бы услышать ответ на этот вопрос - не глумления ради, а пользы для.
Есть у нас такой 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 запросов, невзирая на фильтры?
По прежнему очень хотел бы услышать ответ на этот вопрос - не глумления ради, а пользы для.
