我的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