автоматическая аннулирование кэша запросов - PullRequest
4 голосов
/ 02 октября 2008

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

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

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

class Container {
  @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)<br>
  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) повторить первый шаг
затем на третьем шаге я не вижу элемент, который я вставил на втором шаге. Я вижу их, только если я очищаю кеш вручную после вставки новых элементов:

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

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

Заранее спасибо за ответ. Привет Том

Ответы [ 3 ]

6 голосов
/ 10 июля 2009

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

1 голос
/ 03 октября 2008

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

Чтобы решить эту проблему, вам нужно просто позвонить SessionFactory.evictQueries .

0 голосов
/ 04 июня 2012

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

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

P.S. "Билл Ящерица" спасибо за понимание:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...