[英]JPA Web application management strategies
我們目前正在使用JPA作為我們的數據訪問層開發J2EE Web應用程序。 我們目前正在采用幾種不同的策略來在我們的應用程序中使用緩存。
EntityManager
EntityManager
我在Hibernate文檔中看到了這兩種策略。 我的問題是哪個更廣泛使用,如果我們每個會話執行EntityManager
,我們是否會通過在不同的請求線程中使用相同的EntityManager
遇到同步問題?
更廣泛使用的方法是按請求創建EntityManager
。 但是這應該對你隱藏。 您應該使用一些依賴注入機制(spring / CDI / EJB),它將注入放置@PersistenceContext
的正確EntityManager
。
如果你感興趣的話是如何在你的bean是某種單獨的單例(一個無狀態bean /一個范圍單例的彈簧bean)的常見情況下實現這一點 - 容器實際上在目標對象中注入了一個代理。 每次查詢代理時,它都會獲取當前的 EntityManager
實例,該實例(至少在spring的情況下)綁定到ThreadLocal
(在這種情況下為= request)
更新:如果要在自行開發的框架中實現此功能,請使用cglib / javassist / JDK代理並將其注入放置@PersistenceContext
的位置。 請求=線程。 在每個需要數據訪問的請求上,創建一個新的EntityManager
並將其存儲在ThreadLocal
。 記得最后清理它,因為servlet容器重用了線程。 從代理中,您可以獲取當前的ThreadLocal
值。
但是如果你不是很喜歡這個項目,那么我建議你選擇更穩定的東西,比如spring,cdi或guice。
你用的是什么服務器? 它應該能夠為您注入EntityManger,而不是要求應用程序處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.