2009-03-22 2 views
1

У меня есть приложение расположений, которое использует Hibernate для доступа к базе данных MYSQL. У меня есть несколько страниц, которые вносят изменения в БД. Эти изменения проходят отлично, данные обновляются в БД. Однако при просмотре страницы, которая должна показывать эту обновленную информацию, ее часто нет, и даже после нескольких обновлений страницы она все еще не существует. В конце концов он появится. Я предполагаю, что это имеет какое-то отношение к данным кэширования спящего режима, но как я могу обеспечить, чтобы данные обновлялись? Я предположил, что, когда все пройдет через сессию спячки, это поднимет изменения? код я использую, чтобы сделать обновление является:Спящий режим не отражает изменения

hSession = HibernateUtil.getSessionFactory().getCurrentSession(); 
    Transaction tx = hSession.getTransaction(); 
    tx.begin(); 
    hSession.update(user) ; 

Затем вытащить, что пользователь снова:

org.hibernate.Session hSession = HibernateUtil.getSessionFactory() 
.getCurrentSession(); 
Transaction tx = hSession.beginTransaction(); 
User u= (User) hSession.load(User.class, userID); 

ответ

3

Слишком мало чтобы действительно дать ответ. Но некоторые пункты для проверки:

  • Вы используете транзакции. Вы правильно их совершаете? Возможно, в какой-то момент ваш код не сможет увидеть изменения, потому что они еще не совершены (или потому, что код чтения находится в другой транзакции, которая использует предыдущее состояние).

  • Кэш-память также может быть проблемой. Чтобы проверить, вы можете явно очистить кеш после каждого изменения в БД (Session.flush()). Это, вероятно, ухудшит производительность, но может помочь вам сузить проблему.

+0

Да, транзакция должна быть явно зафиксирована в вышеуказанной настройке. – javashlook

1

Это, вероятно, является результатом second level (session factory) hibernate cache.

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

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

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

+0

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

+0

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

Смежные вопросы