2012-03-27 73 views
1

我想執行客戶端請求以便他們調用會話bean。但有時第二個請求在第一個請求之前成功執行使用ejb2無狀態會話bean執行順序事務

使用ejb2無狀態會話Bean可以執行順序客戶端請求嗎?

public generate(){ 
    ................. 
    update() 
    ............. 
} 
private update(){ 

    debugLog(" update query for "+id); 

    //code for update query 

    debugLog(" execute update query for "+id); 


} 

當我發送兩個請求,同時我得到了登錄如..

update query for 16 
update query for 16 
execute update query for 17 
execute update query for 16 

但我想能串行執行,它像

update query for 16 
update query for 16 
execute update query for 16 
execute update query for 17 
+0

您能否提供您的意思的示例代碼?這將更容易遵循。 – Prashanth 2012-03-27 11:08:14

+0

請檢查編輯的問題 – chetan 2012-03-27 11:18:35

回答

1

EJB-3.X具體:

  • 您需要單例bean - @Singleton,這裏您使用的是無狀態bean,它可以獨立執行以隨機順序請求的&。

  • 現在按順序對事件進行排序,您必須根據您的要求在類/方法級別使用鎖定機制。

    默認情況下,用@Singleton註釋的bean是容器管理的&使用鎖定模式LockType.WRITE,明確可以應用@ConcurrencyManagement(CONTAINER)。如果客戶端正在調用任何方法,則所有其他請求都必須等待先前的調用返回。

    您也可以在方法級別使用@Lock(LockType.WRITE)進行註釋。因此,調用的順序將與客戶所調用的順序有關。

EJB-2.X具體:

  • 你必須爲註記不可用於創建自己的單。

  • 不確定EJB-2.x中容器管理的併發性,但同步入口方法肯定會有幫助,因爲它在內部調用其他方法。

    編輯:將來自bean的請求委託給單一實用程序類&適當地同步方法。因此,它將解決兩個問題,即共享&與無狀態bean的同步問題。

+0

對於EJB 2.x,同步該方法將不起作用。該容器將池實例並給每個線程一個不同的bean。您需要同步共享/靜態對象。 – 2012-03-28 15:57:37

+0

@bkail但是,如果實現singleton bean實例,那麼同步一個方法可能會起作用。否則作爲一種解決方法,可以使用普通的Java實用程序類來實現此功能,並且可以進一步調用用於數據庫操作的會話Bean方法。 ServiceLocator和委託可能適用於它。 – 2012-03-28 17:55:45

+0

你的意思是,將實例方法委託給單例?這將工作。就像在共享/靜態對象上進行同步一樣。如果你用這個更新你的「EJB-2.x Specific」,我會贊成。 – 2012-03-29 04:03:28