我正在使用Spring,Hibernate和JPA實體管理器。當同時獲取UI的不同區域(通過jquery/ajax)時,我想同步對JPA實體管理器的訪問,否則會導致對共享異常的共享引用。我如何實現這一目標?我有一個控制器調用後端的服務方法,負責調用entitymanager上的get/save等。同步訪問JPA EntityManager
回答
您可以對特定模式的對象應用鎖定。
- 實體管理器:
entityManager.lock(entity, LockModeType.OPTIMISTIC);
- 查詢:
query.setLockMode(LockModeType.OPTIMISTIC);
- NamedQuery:lockMode元素
鎖定模式OPTIMISTIC
是同義READ
& OPTIMISTIC_FORCE_INCREMENT
到WRITE
。
編輯:從文檔
如果事務T1呼籲類型LockModeType.OPTIMISTIC對 鎖的版本對象,實體管理器必須保證既不的 以下現象可以發生:
P1(髒讀):事務T1修改一行。另一個事務T2然後讀取該行並獲得修改後的值,然後T1已提交或回滾了 。事務T2最終成功提交 ;無論T1是提交還是回滾,以及在T2提交之前還是之後都是如此。
P2(不可重複讀取):事務T1讀取一行。另一個事務T2則在T1提交 之前修改或刪除該行。這兩個事務最終成功提交。
鎖定模式必須始終防止現象P1和P2。
因此,如果我理解正確,那麼你所建議的是,我通過注入到spring控制器(目前它的服務)中引入entitymanager,然後使用我認爲需要的操作所描述的鎖定。我無法總是鎖定entitymanager,因爲並非所有操作都需要將其鎖定。 – Supra
@Sup您不必鎖定entityManager,但只需要同時執行操作的所需對象。另外,我認爲沒有必要改變控制器/服務中的任何東西。這裏access或entityManager本身不同步,但是共享結果,它們的訪問是同步的。 –
讓我再次解釋我的情況。我有一個調用serviceA的控制器方法a()。loadAllEntityA()和另一個也調用serviceA.loadAllEntityA()的b(),同時調用a()和b()。現在來自控制器方法,我想要一種方法來鎖定方法a()和b()的對EntityA的訪問。 – Supra
- 1. JPA EntityManager問題
- 2. JPA EntityManager大內存問題
- 3. 與JPA EntityManager的問題
- 4. Glassfish JPA:注入問題EntityManager
- 5. 同步訪問
- 6. @PersistenceContext EntityManager(JPA)
- 7. SPRING BOOT訪問entityManager
- 8. 同步訪問ArrayList
- 9. 無法使用JPA 2.1和Hibernate5訪問EntityManager
- 10. GWT-P + JPA Hibernate EntityManager
- 11. Cloud Foundry + JPA + Spring + EntityManager
- 12. JPA的EntityManager和JavaFX
- 13. 問題與EntityManager與Tapestry和JPA
- 14. 同步問題與JMS和JPA
- 15. 訪問spring注入EntityManager
- 16. F#同步訪問列表
- 17. 同步訪問文件
- 18. 訪談問:Java同步
- 19. .net文件訪問同步
- 20. 同步數據庫訪問
- 21. Vulkan:vkWaitForFences同步訪問VkDevice
- 22. 同步文件訪問
- 23. 同步訪問UITableViewDelegate邏輯
- 24. 同步對SimpleDateFormat的訪問
- 25. 同步數據訪問
- 26. 同步訪問返回值
- 27. 如何同步訪問indexedDB?
- 28. 訪問JPA類映射
- 29. Java CDI @ApplicationScoped同步/異步訪問
- 30. JPA的EntityManager的createQuery()錯誤
JPA實體管理器不是線程安全的,不應該被多個線程使用。每個線程應該有自己的實例。 –
謝謝!如何爲每個請求注入一個單獨的實例(可能是ui控制器方法)?目前我正在將一個實體管理器(擴展持久模式)注入服務層。 – Supra
鎖定對象可能有助於適當的模式 –