Недействительность сессии JPA EntityManager
Проект, над которым я работаю, использует Spring 2.5 & JPA с Hibernate в качестве поставщика.
Мои classы DAO расширяют JpaDaoSupport, поэтому я получаю свой JpaTemplate с помощью метода getJpaTemplate ().
Базовая firebase database может быть изменена либо моим приложением, либо сторонним приложением.
- Проверьте, существует ли сеанс JSF
- Установка таймаута сеанса в Rails 3
- Как я могу обмениваться сеансом между несколькими поддоменами в ASP.NET?
- Что делает атрибут crossContext в Tomcat? Включает ли это совместное использование сеанса?
- Устанавливать ограничение на один сеанс на пользователя за раз
Когда стороннее приложение изменяет базу данных (в основном, изменения данных конфигурации), мне необходимо предоставить пользователю моего приложения возможность аннулировать все сессии JPA и перезагрузить новые данные (т. Е. Аннулировать все сеансы спящего режима в фоновом режиме). Это должно быть «видимо» всеми одновременными пользователями моего приложения.
Как я могу это сделать?
- ASP.NET Почему тайм-ауты сеанса, набор тайм-аута sessionstate
- Hibernate: другой объект с тем же значением идентификатора уже был связан с сеансом
- Chrome localhost cookie не установлен
- Файловые сеансы Firefox
- Сохранение сеанса связанного приложения ASP.NET из другого приложения ASP.NET
- Стресс-тестирование ASP.NET
- Передача данных сеанса между приложениями ASP.NET
- Фиксация сеанса в ASP.NET
Существует два уровня кэшей:
-
1-й уровень – это собственный кэш EntityManager.
Вы можете
refresh
на одном объекте, и он будет перезагружен из базы данных, или вы можетеclear
сам менеджер объектов, и в этом случае все сущности будут удалены из кеша. В JPA нет способа выселить только один конкретный объект из кеша. В зависимости от используемой вами реализации вы можете сделать это, например, методevict
Hibernate. -
Кэширование второго уровня – это глобальный кеш.
JPA 1.0 не обеспечивала поддержку кэша второго уровня. Затем вам нужно полагаться на основную конкретную реализацию или отключить ее. JPA 2.0 рассмотрит эту проблему с
@Cache
annotations@Cache
и API кеша. Вы можете очистить кеш второго уровня, используя API-интерфейс Hibernate, напримерSessionFactory.evict(...)
.- Недостаток кэша второго уровня Hibernate
Расширенные проблемы с кешированием:
-
Кэш запросов
Результат некоторых запросов можно кэшировать. Опять же, не поддерживайте его в JPA 1.0, но в большинстве реализаций есть способы указать, какой запрос будет кэшироваться и как.
- Понимание кэша запросов в Hibernate
-
Кластеризация
Затем возникает также утомительная проблема синхронизации кешей между узлами в кластере. В этом случае это в основном зависит от используемой технологии кэширования, например кеша JBoss.
Ваш вопрос по-прежнему носит общий характер, и ответ будет зависеть от того, что вы делаете.
Я работал над системой, было бы много обновлений, если вы не перейдете в hibernate, и мы, наконец, отключили кеш второго уровня.
Но вы также можете отслеживать все открытые сеансы и при необходимости высекать все кеши 1-го уровня всего открытого сеанса, а также кеш второго уровня. Вам все равно нужно будет управлять синхронизацией самостоятельно, но я думаю, что это возможно.
С архитектурной точки зрения, не очень хорошая идея позволить другому приложению обойти всю вашу бизнес-логику и модифицировать постоянные данные. Это делает землю под ногами вашего приложения дрожащим во многих отношениях 🙂
Не было бы хорошей идеей интегрироваться с этой другой системой более элегантным способом, например, обработкой сообщений или пакетной обработкой. Весна имеет большую поддержку для обоих из них.