描述......
我们的客户更新数据库。然后更新Hibernate数据库,服务器应该在那一刻从数据库中读取更新的值。但它没有发生。要从数据库中读取更新的值,我必须重新启动服务器。然后我看到更新的值。
发生了什么事?
答案 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();