2011-12-13 56 views
3

我有一個DBManager單身人士,確保實例化一個單一的EntityManagerFactory。儘管如此,我正在討論使用單個或多個EntityManager,因爲只有一筆交易與EntityManager相關聯。OpenJPA交易 - 單個或多個實體經理?

我需要使用多個事務。 JPA不支持嵌套事務。

所以我的問題是:在大多數在單個數據庫環境中使用事務的普通應用程序中,您是否完全使用單個的EntityManager?到目前爲止,我一直在使用多個EntityManager s,但希望看看創建一個可以做到這一點,並加快一點。

所以我發現下面的幫助:希望它也可以幫助別人。 http://en.wikibooks.org/wiki/Java_Persistence/Transactions#Nested_Transactions

在技術上JPA EntityManager的是在從 點它被創建的事務。所以開始有點多餘。直到開始調用 ,某些操作如堅持,合併,刪除不能被調用 。查詢仍然可以執行,並且查詢對象 可以更改,雖然這有點不明確,但對於JPA規範中的這些更改會發生什麼 ,通常它們將被提交,但最好在創建任何內容之前調用begin更改爲您的 對象。通常最好爲每個 事務創建一個新的EntityManager,以避免在持久性 上下文中保留過時的對象,並允許先前管理的對象進行垃圾收集。

成功提交後,可以繼續使用EntityManager, 和所有受管理的對象保持管理狀態。但通常最好關閉或清除EntityManager以允許垃圾回收 並避免陳舊的數據。如果提交失敗,則將被管理對象 視爲分離,並清除EntityManager。這意味着 提交失敗不能被捕獲並重試,如果發生失敗 ,則必須重新執行整個事務。之前的被管理對象也可能處於不一致狀態,這意味着對象鎖定版本的某些可能已被增加。如果事務已標記爲回滾,則提交將會失敗 。如果有任何查詢或查找操作失敗,則可以通過調用setRollbackOnly明確地發現 ,或者要求 被設置。這可能是個問題,因爲 某些查詢可能會失敗,但可能不希望導致整個事務回滾。

回滾操作將僅回滾數據庫事務。 持久化上下文中的託管對象將分離 並清除EntityManager。這意味着以前的任何對象 都不應再使用,並且不再是持久性上下文的一部分。對對象所做的更改將保留爲 ,對象更改將不會恢復。

回答

3

EntityManager根據定義,s不是線程安全的。因此,除非你的應用程序是單線程的,否則使用單個EM可能不是一種方法。

+0

基於CLI的應用程序是單線程的&鑑於您不調用任何Thread.start(),它是正確的嗎? – thirdy 2011-12-28 04:40:53