Отключение спящего режима кэширования - PullRequest
1 голос
/ 08 декабря 2011

Я уже понял, что есть много вопросов относительно кеширования и гибернации на SO, но я не смог найти решение своей проблемы. Большинство вопросов, где реферирование с использованием гибернации напрямую без использования JPA.

Мы используем Spring с Hibernate, настроенным в качестве поставщика JPA. Само приложение представляет собой веб-приложение, использующее JSF. Базовой базой данных является SQL Server 2008.

В соответствии со спецификацией JPA мы добавили следующее к persistence.xml.

<shared-cache-mode>NONE</shared-cache-mode>

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

Как отключить кеширование? Мы получаем данные способом JPA с такими запросами, как:

@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager em;
...
return em.createQuery("SELECT mt FROM " + MyTable.class.getSimpleName() + " mt",
                      MyTable.class).getResultList();

@ axtavt Я запускаю приложение и загружаю в браузер страницу, которая запрашивает таблицу. Я переключаюсь на свою СУБД и делаю обновление на столе. Я открываю второй браузер, и он все еще показывает старые данные, а не обновленные.

Обновление Я провел еще несколько тестов. Я использовал @PersistenceContext с EXTENDED. Я добавил это здесь. Если я уберу это, это работает, однако я сталкиваюсь с другими проблемами тогда ...

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

В hibernate они называют его кэшем второго уровня, потому что сам сеанс hibernate служит в качестве кэша первого уровня.Сеанс (контекст постоянства) обычно кэширует объекты на время одного метода @Transactional, просто чтобы убедиться, что объектные отношения поддерживаются правильно.

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

1 голос
/ 08 декабря 2011

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

Я никогда раньше не использовал решение EXTENDED, но насколько я могу судить, при использовании EXTENDEDзафиксировать длительную транзакцию, чтобы другие транзакции могли видеть результат.Посмотрите, как зафиксировать транзакцию при использовании типа EXTENDED персистентный контекст .

0 голосов
/ 08 декабря 2011

Я провел еще несколько тестов.Я использовал @PersistenceContext с EXTENDED.Я добавил это в основной пост.Если я удаляю EXTENDED, обновление работает.Однако тогда я сталкиваюсь с другими проблемами ...

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