сервер не читает обновленные данные из базы данных - PullRequest
3 голосов
/ 01 сентября 2010

Описание ....

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

Что происходит?

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Hibernate использует внутренний кэш для оптимизации доступа к базе данных.

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

Подробнее о кэшировании и настройке Hibernate можно прочитать здесь: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

1 голос
/ 01 сентября 2010

Из вашего описания вы, вероятно, используете Hibernate кэш 2-го уровня (кластер или кэш уровня JVM), и когда вы обновляете базу данных напрямую, вы явно игнорируете API Hibernate, и Hibernate не получает возможности очистить кэш, чтобы он мог обновляться.

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

Из документации по Hibernate:

19,3. Управление кешами

...

Для кеша второго уровня есть методы, определенные в SessionFactory для высвобождая кэшированное состояние экземпляр, весь класс, коллекция роль экземпляра или всей коллекции.

sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class);  //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections

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

Ссылки

0 голосов
/ 01 сентября 2010

Вы обновляете базу данных вручную или обновляете ее с помощью hibernate?

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

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

Чтобы сбросить сразу после вызова HibernateDaoSupport.getHibernateTemplate().update(transientInstance);, вы можете вызвать HibernateDaoSupport.getHibernateTemplate().flush();

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