簡體   English   中英

為什么 hibernate/ehcache 二級緩存總是在同一個 session 內丟失?

[英]Why does hibernate/ehcache second level cache always miss within the same session?

我有一個長期運行的 EntityManager,我會定期清除()。 我在我的一個實體上配置了一個讀寫緩存。

我做了一些調查,我可以看到該實體存在於緩存中。 我什至可以看到來自net.sf.ehcache.Cache.searchInStoreWithStats()的緩存命中。 但是,如果實體的時間戳晚於創建 session 時的時間戳,則 ehcache 不會返回實體:請參閱AbstractReadWriteEhcacheAccessStrategy.get(Object, long)

這種行為的原因是什么? 有沒有辦法可以自定義 hibernate 或 ehcache 以在單個 EntityManager 中實現緩存命中?

看起來這是讀寫緩存的一個屬性:您無法從同一 session 中創建的緩存中獲取實體。

非嚴格的讀寫緩存不比較時間戳,所以這確實在第一次 load() 之后實現了緩存命中。

更好的是,事務緩存在persist() 之后填充緩存,因此第一個load() 將導致緩存命中。 由於我與數據庫的交互完全在單個 JVM 中的單個線程內,我相信這可以安全使用。

正如 JavaDoc 所說:時間戳表示實體是在事務開始后創建的,因此事務不可能看到它(根據ACID )。

因此,您似乎有多個事務,例如 A 和 B。您啟動 B,然后是 A,然后 A 創建實例 X,然后 B 嘗試查找 X -> 緩存未命中,因為 A 尚未提交(例如) .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM