簡體   English   中英

具有擴展持久性上下文的有狀態 EJB 以處理用戶 session

[英]Stateful EJB with extended persistence context to handle user session

我正在使用 CDI session 范圍 bean 來保存用戶相關信息(他的用戶實體 bean、憑據等)。 每次用戶更改他的信息(如 email、密碼等)時,我都有一個保存方法。 但是,我可以有一個具有擴展持久性上下文的有狀態 session bean 來執行此操作。 如果我這樣做,他的用戶實體將在他的 session 期間被管理,並且對他的 email 等的更改將在不重新創建持久性上下文等的情況下同步。這是個好主意嗎? 我應該有一個擴展的持久性上下文打開這么長時間嗎? 這也會鎖定用戶對外部 bean 的更改,對嗎? 如果我有管理員嘗試更改此用戶怎么辦(可能發生)。

您需要注意一些副作用。

第一件事是你用來保存這個用戶實體的擴展持久性上下文不應該用於其他太多,因為它會自動緩存所有被觸摸的東西(L1 緩存)。

如果您需要在處理其他一些持久性上下文的其他操作中使用此連續附加的用戶實體,則需要獲取一個新實例,而不是使用 session scope 中的實例。

鎖定的事情不會自動發生。 通常,不同的持久化上下文也可以修改同一個實體。 通常,最后一個進行任何寫入的人將“獲勝”。 如果要防止這種情況,可以利用 JPA 中的正常鎖定操作。 對於這種情況,樂觀鎖可能最適合。

我很好奇這在實踐中會有多好。 這肯定是一個新奇的想法。 通過閱讀許多博客文章、文章、書籍和與許多開發人員的討論,我感覺擴展的持久性上下文是鮮為人知的事情,並且沒有為它創建太多的最佳實踐。

有狀態的 session bean 現在可以通過 CDI 作用域(因此在例如 HTTP session 被破壞時自動銷毀)這一事實使整個概念更加可行。 但 CDI 也相對較新,很多人仍然需要探索如何最好地使用它。

我在各種 Java EE 6 項目中使用擴展的持久性上下文,這是場景:

  • 一個“外觀”(sfsb),注入服務
  • 一個“服務”注入 EM
  • 一個“ dbproducer ”將 EM 生成到門面的會話 scope
  • 外觀默認禁用所有事務(例如loadEntity()沒有事務)
  • 某些外觀方法顯式啟用事務(例如saveEntity()具有事務)

會發生什么:

  • 一個實體被加載並在整個對話期間保持管理(由持久性上下文完全緩存,在沒有事務的情況下不會刷新)。
  • 如果(且僅當)保存實體時,將顯式打開事務,並且如果事務成功,持久性上下文會刷新到數據庫中。
  • 如果確實發生了任何其他編輯(例如由管理員),將拋出OptimisticLockingException ,並由應用程序處理

這就像一個魅力,感覺也很優雅:-)

一個警告 - 因為 EM 不可序列化 - *如果 *您在集群中工作,您將被迫使用粘性 session 策略,因為這些 EJB 無法從一台服務器移動到另一台服務器。

您可能還想考慮某種方式讓 EM 加入現有事務(如果每個請求有多個服務調用,這很容易發生)。 如果您在非 Seam 3 堆棧上,則可以選擇代理 EM,如果您在 Seam 3 上,請使用@Unwraps (Solder) 而不是@Produces並檢查是否有要加入的事務。

暫無
暫無

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

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