2017-01-10 54 views
0

我想從數據庫中及時獲取對象。我決定不允許緩存我的實體。通過採用這種結構:@EclipseLink中的緩存

@Cache(
     type = CacheType.NONE/*, 
     alwaysRefresh = true, 
     disableHits = true, 
     coordinationType = INVALIDATE_CHANGED_OBJECTS*/ 
) 

但我已閱讀the documentation here說:

NONE

public static final CacheType NONE 
WARNING: Does not preserve object identity and does not cache objects. 

那是警告重要的是,我可以理解JVM可能misrelate對象以自己的真實身份! 是否有任何建議沒有緩存一個對象,如alwaysRefresh例如對象的最佳配置。

回答

1

如果您的程序是使用數據庫的唯一應用程序,則不應禁用高速緩存,如果有多個客戶端,則禁用高速緩存或重新配置高速緩存可能是正確的。

與任何緩存策略一樣,權衡是在速度和陳舊數據之間進行權衡。大多數JPA實現在文本(PC可以是第一級緩存)之間共享(第二級)緩存,所以當使用em.find()加載實體時,不需要如果實例已被緩存,則訪問數據庫。如果另一個客戶端有權訪問數據庫,那麼如果數據庫被修改,您最終可能會提供陳舊的數據。

如果您有一個集羣JPA應用程序,並且該數據庫只能由您的JPA應用程序訪問,那麼只要您配置緩存協調,仍然可以使用緩存。當使用緩存協調時,一個實例會通知其他實體是否已更新實體,因此其他實例可以更新其緩存或放棄緩存版本。

在我建立的解決方案中,我幾乎總是必須禁用緩存,因爲數據庫有多個客戶端,我們從不想顯示過時的數據。

+0

非常感謝。實際上,我的應用程序被許多客戶通過局域網使用。所以,我決定鍵入= CacheType爲SOFT(不丟失身份)並且alwaysRefresh爲true。如果您同意只是對您的答案進行一些更新以使其成爲正確的答案 –

+0

我通常在JPA提供程序上全局配置它。如果您使用的是persistence.xml,則可以添加 NONE。通常我使用EclipseLink的代碼方式,所以它設置'''jpaProperties.setProperty(org.eclipse.persistence.config.PersistenceUnitProperties.CACHE_SHARED_DEFAULT,「false」)'''。 –

+0

將緩存設置爲nono將導致實體的引用問題。這一個有一些隨機問題,像我面臨的:http://stackoverflow.com/questions/20920400/jpa-2-eclipselink-caching-issue?lq=1 –

相關問題