Странная проблема с Hibernate Cache - PullRequest
1 голос
/ 07 октября 2008

Мы используем Hibernate 3.1 с Spring MVC 2.0. Наша проблема возникает, когда данные обновляются непосредственно в базе данных (а не в приложении). Мы используем фильтр для фильтрации коллекции результатов по тому, открыты или закрыты ордера. Если мы изменим ордер на закрытие БД, фильтр вернет правильный список, однако статус объекта не изменится.

  • У нас не разрешено кэширование второго уровня или запросов.
  • Извлечение коллекции из БД осуществляется через Session.createQuery Hibernate.
  • Кроме того, у нас есть один проводной SessionFactory, и мы используем один сеанс во всем приложении.

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

Ответы [ 4 ]

3 голосов
/ 07 октября 2008

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

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

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

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

Взгляните на ehcache в Hibernate.

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

Вы можете использовать версию Hibernate Version . Ваш внешний процесс должен будет увеличить номер версии (или метку времени), чтобы Hibernate узнал, что доступна новая версия.

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

Имеет несколько недостатков:

  • Ваше приложение может работать некоторое время со старыми данными
  • Если версия была увеличена за счет пакетного задания, и hibernate пытается сохранить обновленную запись более старой версии, вы получите исключение
  • Общая база данных будет масштабироваться хуже; частая проверка стоит производительности.

Я ни в коем случае не эксперт Hibernate, но это возможно.

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

Вы не можете ожидать, что Hibernate будет правильно управлять «грязным» состоянием своих кэшированных объектов, когда у вас есть процессы, «идущие за его спиной». Если вы используете аннотации, я бы предложил пометить статус (если это имя поля) как @Transient, чтобы Hibernate знал, что должен каждый раз получать это значение из базы данных.

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