我的Java应用程序每10秒询问一次查询MySQL服务器。
我手动在表格中插入一个新行。
而Hibernate找不到它。
另外,当我手动删除一行时,Hibernate显示该行存在。
我建议这是因为Hibernate缓存。
有什么办法可以禁用它吗?
谢谢!如何彻底禁用Hibernate缓存? (与春季3,休眠与注释)
8
A
回答
11
您的意思是第一级缓存还是第二级缓存?使用Hibernate二级高速缓存(如Ehcache)高速缓存与您手动修改的同一表中的行对应的实体可能会导致您描述的行为。第一级缓存不会导致这种行为,无论如何,我认为你不能禁用它。
要禁用Hibernate二级缓存,请从Hibernate配置文件hibernate-cfg.xml
中删除引用二级缓存的所有行。例如:
<!-- Enable the second-level cache -->
<property name="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.EhCacheProvider
</property>
<property name="hibernate.cache.region.factory_class">
net.sf.ehcache.hibernate.EhCacheRegionFactory
</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_structured_entries">true</property>
<property name="hibernate.cache.generate_statistics">true</property>
-1
可以使用 hints.put( “javax.persistence.cache.retrieveMode”,CacheRetrieveMode.BYPASS); ()它可能工作。
1
为了“尝试”禁用第一级缓存,每次请求EntityManager时都会将其逐出。为我工作;)
public EntityManager getEntityManager(){
if(emf == null){
if (parameters == null) {
emf = Persistence.createEntityManagerFactory(persistenceUnitName);
} else {
emf = Persistence.createEntityManagerFactory(persistenceUnitName, parameters);
}
} else {
emf.getCache().evictAll();
}
EntityManager em = emf.createEntityManager();
return em;
}
+1
谢谢,这对我有用。 – CrushedPixel 2016-07-19 11:35:18
嗨德里克,谢谢你的回复!嗯,似乎我没有二级缓存,也许试图去除一级?我怎样才能做到这一点? – gennad 2010-11-15 19:16:26
据我所知,你不能禁用第一级缓存,但根据http://stackoverflow.com/questions/3943366/how-can-i-configure-hibernate-to-immediately-apply-all-saves -updates-and-delete/3946939#3946939,Spring可以启用第一级缓存的急切刷新,这将有效地实现相同的结果。 – 2010-11-16 05:41:52