1

我有一个使用 Hibernate 访问 MYSQL DB 的 struts 应用程序。我有许多对数据库进行更改的页面。这些更改顺利进行,数据在数据库中更新。但是,当浏览到应该显示此更新信息的页面时,它通常不存在,即使在几次页面刷新后它仍然不存在。最终它会出现。我假设这与休眠缓存数据有关,但是如何确保数据是最新的?我曾假设,当这一切都通过休眠会话时,它会接受变化?我用来进行更新的代码是:

    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);
4

2 回答 2

3

信息太少,无法真正给出答案。但有几点需要检查:

  • 您正在使用事务。你是否正确地提交了它们?也许在某些时候您的代码看不到更改,因为尚未提交(或者因为读取代码在另一个使用先前状态的事务中)。

  • 缓存也可能是个问题。要检查,您可以在每次更改数据库 (Session.flush()) 后显式刷新缓存。这可能会降低性能,但可能会帮助您缩小问题范围。

于 2009-03-23T00:05:18.957 回答
1

这可能是二级(会话工厂)休眠缓存的结果。

缓存应该是透明的,并且可以与您提供的代码一起正常工作,但通常在以下情况下会出现问题:

  1. 您正在运行一个机器集群,并且没有办法让配置的缓存相互失效
  2. 您正在休眠之外更新数据库。

确定它是否是二级缓存问题的最简单方法是在您的休眠配置中完全禁用缓存。如果是缓存,您可以配置集群以相互了解,以便他们可以自动管理缓存,或者如果是外部休眠更新的问题,您可以使用休眠 api手动使缓存项无效

于 2009-03-23T00:02:17.263 回答