在我的應用程序中,當用戶登錄系統時,系統從DB讀取一些設置並將它們存儲在用戶的會話中。系統通過使用EclipseLink的JPA查詢執行此操作(JPA 2.0)。禁用EclipseLink緩存
當我更改數據庫中的某些設置並重新登錄時,查詢將返回以前的結果。看來EclipseLink正在緩存結果。
我已經使用這個來糾正這種行爲,但它不工作:
query.setHint(QueryHints.cache_usage,cacheUsage.no_cache);
在我的應用程序中,當用戶登錄系統時,系統從DB讀取一些設置並將它們存儲在用戶的會話中。系統通過使用EclipseLink的JPA查詢執行此操作(JPA 2.0)。禁用EclipseLink緩存
當我更改數據庫中的某些設置並重新登錄時,查詢將返回以前的結果。看來EclipseLink正在緩存結果。
我已經使用這個來糾正這種行爲,但它不工作:
query.setHint(QueryHints.cache_usage,cacheUsage.no_cache);
如果你想設置查詢提示,則docs建議這樣做:
query.setHint("javax.persistence.cache.storeMode", "REFRESH");
或者,您可以設置受影響的實體的@Cacheable
註釋
@Cacheable(false)
public class EntityThatMustNotBeCached {
...
}
如果你返回某種配置實體,並希望確保數據不陳舊,你在從查詢中返回實體後可以調用em.refresh(yourEntity)
。這將迫使JPA提供者從數據庫中獲取新數據,儘管緩存了一個。
如果您希望禁用您可以在persistence.xml
內<persistence-unit>
使用<shared-cache-mode>NONE</shared-cache-mode>
或直接在您的配置實體使用Cacheable(false)
L2高速緩存。
如果您要返回普通字段而不是實體,並且仍舊收到過時的數據,則可以嘗試通過調用em.clear()
來清除PersistenceContext
。