2008-10-02 7 views
3

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

Вот более конкретный пример. У меня есть постоянная сущность, называемая Контейнер, которая может иметь много элементов. Я хотел, чтобы все элементы в кэше:

 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
class Item 
{ 
    // rest of the code ... 
} 

class Container { 
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... } // rest of the code ... }

Проблема, которую я заметил, что когда я:

1) читать некоторые контейнеры из БД в памяти (вместе с соответствующими элементами)

String hql = 
     "from Container c left join fetch c.items where c.type = 1"; 
    List<Item> list = hibernateTemplate.find(hql); 

2) вставить новый пункт для выбранной контейнерной

hibernateTemplate.save(item) 

3) повторить пихта st step
, то на третьем этапе я не вижу элемент, который я вставил на втором шаге. Я вижу их только тогда, когда я очистить кэш вручную после установки новых элементов:

sessionFactory.evictCollection("Container.items", updatedContainerId) 

Моя интуиция подсказывает мне, что Hibernate должен сделать такой недействительность кэша автоматически. Кто-нибудь видел, как он работает? Я что-то делаю неправильно или просто не поддерживается?

Заранее благодарим за ответ. Приветствия Том

+0

Я только что ответил на этот день: http://stackoverflow.com/questions/4500221/hibernate-sqlquery-bypasses-hibernate-session-cache/10828200#10828200 – 2012-06-04 17:51:59

ответ

1

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

Для решения этой проблемы необходимо просто позвонить SessionFactory.evictQueries.

6

Вы могли бы найти свой блог в выработках кэша запросов, чтобы быть полезным в понимании того, что кэш запросов делает и почему он не может работать так, как вы думаете, это работает:

+0

Уход поставить в этом ответе хотя бы минимальное объяснение по поводу вопроса? – Scadge 2017-12-29 12:44:39

-1

Да , автоматическое аннулирование кеша запроса отсутствует для собственных SQL-запросов. Для HQL-запросов он просто ПРОЧИТАЕТ ВСЕ КАРТЫ, если в какой-либо из таблиц, участвующих в запросе, есть INSERT/UPDATE/DELETE для любого объекта.

Таким образом, вы можете попробовать проект Hibernate Dynamic SQL Cache, он предназначен для решения этой проблемы путем автоматического обновления кэшей SQL-запросов без аннулирования.

P.S. «Bill the Lizard» спасибо за недоумение :)

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