服务器没有从数据库中读取更新的数据

时间:2010-09-01 09:34:05

标签: java hibernate orm

描述......

我们的客户更新数据库。然后更新Hibernate数据库,服务器应该在那一刻从数据库中读取更新的值。但它没有发生。要从数据库中读取更新的值,我必须重新启动服务器。然后我看到更新的值。

发生了什么事?

3 个答案:

答案 0 :(得分:3)

Hibernate使用内部缓存来优化数据库访问。

手动更新数据库时,Hibernate缓存不会更新,因此您的值不会立即显示。重新启动服务器时,缓存将被清空,因此会显示新值。

您可以在此处阅读有关Hibernate缓存和配置的更多信息:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

答案 1 :(得分:1)

根据您的描述,您可能正在使用Hibernate 2nd level cache(集群或JVM级缓存),当您直接更新数据库时,您显然会绕过Hibernate的API,而Hibernate没有机会清空缓存所以它可以刷新。

如果您想避免重新启动服务器,请避免手动更新明确告知Hibernate在手动更新后清空缓存的相关部分,以便重新加载数据。您可以使用evict()级别的各种重载SessionFactory方法执行此操作。

来自Hibernate文档:

  

19.3. Managing the caches

     

...

     

对于二级缓存,有   在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

当然,这需要了解您的应用程序中缓存的内容以及客户端更新的内容。但有人必须知道这一点。

参考

答案 2 :(得分:0)

您是手动更新数据库还是使用hibernate更新数据库?

如果您是手动执行此操作,则根据您的缓存配置,您可能需要重新启动服务器以清理hibernate缓存。

如果你用hibernate更新数据库,如果你不能读取更新的值,它可能与刷新hibernate的配置有关。

要在HibernateDaoSupport.getHibernateTemplate().update(transientInstance);来电后立即刷新,您可以拨打HibernateDaoSupport.getHibernateTemplate().flush();