2012-10-17 50 views
2

禁用緩存我曾嘗試禁用L2高速緩存中的EclipseLink與Eclipse靛藍: -如何通過在persistence.xml使用以下性質的EclipseLink

<property name="eclipselink.cache.shared.default" value="false"/> 

<shared-cache-mode>NONE</shared-cache-mode> 

基本上我正在測試一個場景相同的對象是否在兩個不同的創建會話正在訪問數據庫兩次,或者兩個會話都指向在內存緩存中早期會話中創建的同一對象。它不應該因爲L2緩存由上面的persistence.xml性能提禁用

我的代碼如下: -

Session session = DataAccessManager.getManager().openSession(); 
ReferenceObjectRepository referenceObjectRepository =  ReferenceObjectRepository.getInstance(); 
ReferenceObjectKey referenceObjectKey = new ReferenceObjectKey(getStringValue("testCacheByPass.input")); 
//load object first time. 
ReferenceObject referenceObject = referenceObjectRepository.load(ReferenceObject.class, referenceObjectKey); 
logger.log(Level.SEVERE, "Cache ReferenceObject: " + referenceObject); 

//load object in another session 
Session sessionNew = DataAccessManager.getManager().openNewSession(); 
Object dbObject = referenceObjectRepository.load(ReferenceObject.class, referenceObjectKey); 
logger.log(Level.SEVERE, "DB loaded ReferenceObject: " + dbObject); 

請幫助我,我是否錯過了什麼?還是我需要以其他方式做?

+0

此代碼完全抽象出EclipseLink/JPA,因此很難驗證您爲查詢使用單獨的EntityManager實例。代碼本身使它看起來像你正在重複使用相同的referenceObjectRepository--這可能是問題的一部分嗎?如果它重用相同的基礎EntityManager實例,則必須返回相同的實體實例,除非它被清除。 – Chris

回答

1

您已禁用對象緩存,但我認爲您仍然有查詢緩存。您應該也可以禁用查詢緩存

<property name="eclipselink.query-results-cache" value="false"/> 
<property name="eclipselink.refresh" value="true"/> 

也可以使用查詢提示設置相同的東西。如果persistence.xml配置似乎不工作,您也可以嘗試使用查詢提示。

另外請注意,即使沒有緩存,你會比較相同的對象,所以除非它被分離,否則應該是相同的。

相關問題:

2

加入這一行,其中調用了每個功能。諮詢視圖時使用find函數。

((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll(); 

此行在運行de查詢前清除緩存。

public Entity find(Object id) { 
    ((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll(); 
    return em.find(Entity.class, id); 
} 
+0

This Works!但只有當我創建新的'EntityManager'時。 ();()();()()();()(); getElement(); getEventityMapAccessor()。invalidateAll();' –

相關問題