2015-06-02 40 views
0

我不明白關於stateless session beans。該文檔說實例變量可能包含特定於客戶端的狀態,然後說方法完成後不應該保留狀態。客戶特定狀態在無狀態ejb

假設有一個方法X和兩個客戶端同時被調用。方法X將客戶端名稱保存在實例變量中。我發現當多個線程同時調用同一個方法時會出現問題。

T1訪問X和X在實例變量中設置客戶端名稱並休眠。 T2訪問X,X在實例變量中設置客戶端名稱並休眠。 T1恢復,X現在看到T2的數據。

這不是問題嗎?或者,容器是否爲每個客戶端創建了一個新實例,並且一旦該呼叫被返回就銷燬ejb?

其次 - 然而,客戶端可能會改變池中無狀態bean的實例變量的狀態,並且這個狀態被保留到下一次池狀態bean的調用中。

這是否意味着同一客戶端可以通過不同的方法調用查看其數據?或者是否意味着不同的客戶端在方法調用之間查看其他數據?

回答

1

這不是問題嗎?不是,第二個客戶端在第一個請求完成之前不會獲得對同一個bean實例的引用(它與線程調度機制無關,它根據請求工作)。

這是否意味着相同的客戶端可以跨不同的方法調用查看其數據?或者是否意味着不同的客戶端在方法調用之間查看其他數據?對於這兩個問題,如果從池中爲兩個不同的請求獲取同一個bean實例,那麼的確如此。

+0

讓我們假設這些bean不合並。所以當兩個請求到來時,容器是否爲每個請求創建兩個實例或者在第一個請求完成之前持有第二個請求? –

+0

我認爲這取決於容器。您應該能夠將容器配置爲不會池會話bean,但強制它始終創建另一個會話bean。但無論如何,在任何時候總是隻有一個請求與單個bean實例一起工作。如果池已打開,並且在請求請求時沒有可用的Bean,則會阻止該請求,直到實例變爲空閒爲止。 –