Недействительность сессии JPA EntityManager

Проект, над которым я работаю, использует Spring 2.5 & JPA с Hibernate в качестве поставщика.

Мои classы DAO расширяют JpaDaoSupport, поэтому я получаю свой JpaTemplate с помощью метода getJpaTemplate ().

Базовая firebase database может быть изменена либо моим приложением, либо сторонним приложением.

Когда стороннее приложение изменяет базу данных (в основном, изменения данных конфигурации), мне необходимо предоставить пользователю моего приложения возможность аннулировать все сессии JPA и перезагрузить новые данные (т. Е. Аннулировать все сеансы спящего режима в фоновом режиме). Это должно быть «видимо» всеми одновременными пользователями моего приложения.

Как я могу это сделать?

Существует два уровня кэшей:

  • 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-го уровня всего открытого сеанса, а также кеш второго уровня. Вам все равно нужно будет управлять синхронизацией самостоятельно, но я думаю, что это возможно.

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

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

  • Как установить тайм-аут сеанса в Laravel 4.2?
  • Как автоматически отключить пользователей после периода бездействия?
  • Как сделать аутентификацию без учета состояния (без сеанса) и без cookie?
  • Получить запрос и параметры сеанса и атрибуты со страниц JSF
  • Преимущества Cache vs Session
  • asp.net - сеанс - несколько вкладок браузера - разные сеансы?
  • ASP.NET: изменения Session.SessionID между запросами
  • Как установить тайм-аут сеанса в web.config
  • Почему PHP session_destroy () не работает?
  • Срок службы сеанса symfony2
  • В чем разница между session.Merge и session.SaveOrUpdate?
  • Interesting Posts

    Safari: как напрямую перейти от «omnibox» (т. Е. «Поле интеллектуального поиска») к результатам поиска (как в Chrome)?

    Как использовать servlets и Ajax?

    Caps Lock сопоставляется с Shift

    Условия автоматической генерации операций по умолчанию / копирование / перемещение ctor и копирования / перемещения?

    C # управление транзакцией через несколько баз данных

    Создайте правило / class CSS с jQuery во время выполнения

    C ++ 11 не выводит тип, когда задействованы функции std :: function или lambda

    Оператор ‘||’ не может применяться к операндам типа «lambda-выражения» и «lambda-выражения»

    Составьте список селекторов с МЕНЬШЕ

    Перенаправление на внешний URI из ASP.NET MVC-controllerа

    REST API – DTO или нет?

    Какие свойства CSS наследуются?

    Ошибка: неожиданный символ / ввод / строка константа / числовая константа / SPECIAL в моем коде

    Как отправить весенний токен csrf из клиента Postman rest?

    Преобразование String в System.IO.Stream

    Давайте будем гением компьютера.