目前的情況是我使用的是JSF請求範圍豆做我的CRUD操作。正如我相信你最有可能知道Tomcat沒有提供容器管理的持久性,所以在我的CRUD請求bean中,我使用EnityManagerFactory來獲得Enity manager的摺疊。現在,我的選擇使用請求的有效性範圍的bean完成這個任務,它可能是開放的討論(再次),但我一直在試圖把它放在我的文章已經閱讀上下文,你給我鏈接特別是第一個和第二個。從我收集的內容中,EclipseLink默認使用存儲緩存實體的二級緩存。在ExlipseLink例子 - JPA緩存網站上面說:JPA2實體緩存
持久化單元(EntityManagerFactory的,或服務器)
的時間共享緩存中現在並不使我的緩存的實體住了在正在對CRUD請求bean進行調用期間的一小部分時間,因爲bean被銷燬的時刻以及EntityManagerFactory所以是緩存。此外,上面一句的最後一部分「的EntityManagerFactory,或服務器」讓我困惑..什麼正是由或服務器在這方面的意思,一個人如何控制它。如果我使用@Cache註釋和到期屬性的設置適當的量,將是做的工作,保持存儲在服務器的二級緩存比實體,不管我的EntityManagerFactory是否已被破壞?
我知道有很多的考慮要做,每個應用程序都有具體的要求。從我的角度來看,配置L2緩存可能是最好的選擇(如果不僅僅是Tomcat),可以優化事情。從你的第一個鏈接引用:
L2高速緩存的優點是:
- 避免數據庫訪問的已加載實體
- 更快的讀取頻繁訪問未修改實體
缺點L2高速緩存的有:
- 內存消耗大量的對象
- 陳舊的數據更新的對象
- 併發寫入(樂觀鎖定異常,或悲觀鎖)
- 糟糕的可伸縮性頻繁或同時更新實體
你應該配置L2緩存是實體:讀
- 經常
- MODI如果陳舊
田間很少
我現在的理解是,有兩個選項,其中只有一個適用於我的情況:
爲了能夠更長期緩存的工作委託給持久層比我更需要有訪問PersistenceContext並創建會話作用域bean並設置PersistenceContextType.EXTENDED。 (這個選項不適用於我,不能訪問PersistenceContext)。
在實體上配置L2 @Cache註釋,或者像上面的選項1一樣,創建一個會處理長期緩存的會話作用域bean。但是,這些不是回到我原來的問題嗎?
我很想聽聽你的意見,看看你認爲可能是解決這個合理的方式,或者是你如何已在以前的項目接近它。哦,還有一件事,只是爲了確認..當使用@Cache註釋一個實體時,所有鏈接的實體都將被緩存,所以我不必對它們進行註釋?
再次所有的評論和指針非常讚賞。
感謝您的閱讀答題..當你說
「在Tomcat中,你將是最好有保存到EntityManagerFactory的服務器期間一些靜態的經理。」
這是否意味着我可以例如聲明和初始化應用程序範圍內的靜態EntityManagerFactory字段以供所有的bean隨後在整個應用程序的整個生命週期中使用?