當我有一個使用單例JPA DAO的無狀態服務類和許多客戶端同時要求相同的方法時,EJB是否將剩餘的請求堆積起來?是否有等待的時間/請求列表大小限制?它是否知道一次只有一個無狀態應該訪問DAO?如果是的話,它是如何做到的?無狀態bean如何處理單例問題?
我想如果有100個請求被創建,100個無狀態bean被實例化,但是隻有一個DAO實例。這會拋出異常還是會發生某種管理?有一個DAO確實使無狀態服務池無用嗎?
最後,有什麼必要有正確的行爲,我的意思是,無狀態bean等待排隊等待單身DAO?
當我有一個使用單例JPA DAO的無狀態服務類和許多客戶端同時要求相同的方法時,EJB是否將剩餘的請求堆積起來?是否有等待的時間/請求列表大小限制?它是否知道一次只有一個無狀態應該訪問DAO?如果是的話,它是如何做到的?無狀態bean如何處理單例問題?
我想如果有100個請求被創建,100個無狀態bean被實例化,但是隻有一個DAO實例。這會拋出異常還是會發生某種管理?有一個DAO確實使無狀態服務池無用嗎?
最後,有什麼必要有正確的行爲,我的意思是,無狀態bean等待排隊等待單身DAO?
對Singleton
的訪問由EJB
容器同步。查看documentation關於協調管理的部分。這從文檔:
辛格爾頓會話bean被設計用於併發訪問,情況,其中許多客戶需要在同一時間訪問一個會話bean的單個實例。單身人士的客戶只需要對單身人士的引用,以便調用由單身人士公開的任何業務方法,並且不需要擔心可能同時在同一單身人士上調用業務方法的任何其他客戶。
我建議使用文檔的這一部分:
註釋一個單獨的業務或超時法@Lock(READ),如果該方法可以同時訪問或共享,與許多客戶。如果在客戶端調用該方法時,單例會話bean應該鎖定到其他客戶端,則使用@Lock(WRITE)註釋業務或超時方法。通常,在客戶端修改單例狀態時使用@Lock(WRITE)註釋。
或者您可以通過使用bean-managed concurency
自己控制同步過程。然後,您需要添加鎖或任何您用來控制對共享資源的訪問。在這種情況下,容器不會參與。
沒有,也不會引發任何異常,容器會使你99個線程等待,而一個將訪問方法,如果你使用
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
和
@Lock(WRITE)
幾乎相同就好像你已經使用了同步塊。
但是,如果假設可以在同步方法上阻塞很多線程,它看起來是一個糟糕的設計。
爲什麼你需要你的DAO成爲一個單身人士?我會說這不是典型的。
我不需要我的DAO成爲單身人士。只是從來沒有想過。感謝您的澄清! – GabrielRado
爲什麼DAO是單身人士?使其無@State也是正常的。瓶頸將成爲連接池的大小。 –
我將DAO設計爲單例,只是因爲第一次在教程中看到了JPA EJB DAO實現時也這樣做了。從那時起,我開始思考它,這些答案讓我確信我不會再遵循這種模式 – GabrielRado