簡體   English   中英

JPA Web應用程序管理策略

[英]JPA Web application management strategies

我們目前正在使用JPA作為我們的數據訪問層開發J2EE Web應用程序。 我們目前正在采用幾種不同的策略來在我們的應用程序中使用緩存。

  1. 根據請求創建EntityManager
    • 在請求范圍內獲取緩存,但在請求結束時丟失緩存
    • 可以輕松回滾整個請求中的任何更改
  2. 每個Http會話創建一個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.

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