2017-01-24 2 views
3

Мы используем Hibernate 3.5.6 вместе с Hazelcast 3.6.1 как кеш второго уровня. У нас есть следующая проблема. У нас есть объект Hibernate с нелицовой коллекцией. При добавлении элементов в коллекцию в два последовательных сеанса на одном узле вся коллекция всегда перезагружается из базы данных. Я бы ожидал, что кеш второго уровня можно просто обновить, когда элемент добавляется в коллекцию, а не полностью вытесняет его из кеша и каждый раз перезагружает его, чтобы добавить еще одну запись. Является ли это основной проблемой кэша второго уровня Hibernate, или это проблема конфигурации на нашей стороне?Обновление кэша второго уровня вместо недействительного

+0

Это может быть связано с емкостью кеша. Вы проверили это? –

+0

<название карты = "по умолчанию"> ... <время к проживанию секунд> 0 <макс-неработающие-секунд> 0 <политика выселения> LRU <максимальный размер политики = "PER_NODE"> 5000 <процент выселения> 25 100 ...

+0

Я изменил конфигурацию соответственно, но это не изменило поведение –

ответ

0

Я думаю, что могу ответить на вопрос сам. На самом деле Hibernate будет не обновить коллекцию, но всегда ее аннулировать. Я нашел здесь следующее объяснение: http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache:

Что такое семантика кэширования? Ну, главное, что коллекции никогда не обновляются в кеше; они только недействительны из кэша и затем потенциально кэшируются позже, как результат чтения другой базы данных. Итак, если приложение с именем Group.addMember(), Hibernate удалит членскую коллекцию этой группы из кеша. Если JBoss Cache - это реализация кэша второго уровня, это удаление будет распространяться вокруг кластера; коллекция будет удалена из кеша на всех узлах кластера.

Если позднее приложение должно получить доступ к элементам из этой группы, произойдет очередное считывание базы данных, и текущий набор первичных ключей для членов будет помещен в кеш.

0

Кэш-память спящего режима по умолчанию вводится в действие на ПК, поэтому, когда вы выполняете findAll(), он не будет использовать кэш гибернации, когда вы найдете findOne (id).

Если вы хотите кешировать findAll(), я бы использовал аннотации ehcache и @Cache, будьте осторожны с тем, какой ключ он использует для своего кеша. См. http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html

+0

проблемы у нас в том, что мы хотим, чтобы добавить элемент коллектор Тион. Hibernate всегда будет загружать всю коллекцию, чтобы добавить к ней элемент. Проблема в том, что если сбор не может быть загружен из кеша 2-го уровня (что я не понимаю в нашем случае), он всегда будет запрашивать базу данных для загрузки всей коллекции. –

+0

@JanSchaefer исправьте, что вам придется играть роль этого кеша. Я счастлив, что оказался ошибочным, но я часто сталкивался с той же проблемой, что и вы. –

Смежные вопросы