Java: Hibernate не видит изменений в базе данных - PullRequest
7 голосов
/ 30 ноября 2010

У меня есть два разных приложения, которые используют одну и ту же базу данных.Проблема в том, что когда у меня приложение меняет что-то в базе данных, другое не обновляется.

Я пытался сделать session.flush(), но это не сработало.Единственный способ - закрыть весь сеанс и воссоздать его, но, конечно, это занимает слишком много времени.

Ответы [ 4 ]

2 голосов
/ 30 ноября 2010

Краткий ответ: выдайте session.refresh(obj) каждый раз, когда вы хотите отобразить какой-либо объект.Это заставит Hibernate перейти в базу данных.Другое решение - использовать StatelessSession, который ничего не будет кэшировать (даже кэш 1-го уровня), заставляя ваши приложения переходить в базу данных каждый раз, когда требуется запись:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-statelesssession

Но, конечно, если это слишком много, то вы можете рассмотреть возможность использования какой-либо блокировки (пессимистической или оптимистической):

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-optimistic

Но на самом деле, если у вас есть дваПараллельные системы, использующие одну и ту же запись, Hibernate не может решить самостоятельно.Это то, что вы должны учитывать в архитектуре ваших систем.

1 голос
/ 30 ноября 2010

Если я правильно понимаю, это то, что происходит в вашем сценарии:

  • app1 запускает транзакцию
  • app2 (запускается и) фиксирует другую транзакцию
  • app1 ожидает, что сможет прочитать изменения, сделанные app2

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

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

0 голосов
/ 05 сентября 2017

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

0 голосов
/ 30 ноября 2010

Я не проверял это, но у класса Session есть явный метод, который исключает все загруженные объекты.Это должно вызвать перезагрузку из базы данных.

...