1

服務器在GlassFish 3.0上運行無狀態會話Bean中的實例變量 - 狀態是如何維護的?

@Stateless(mappedName="messengerservice") 
public class MessengerService implements MsnService{ 

    int count; 


    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     count = count+1; 
     return count; 
    } 
} 

客戶

for(int i=0;i<5;i++){ 
     MsnService br = (MsnService) ctx.lookup("java:global/EJbTutorial/MessengerService"); 
     System.out.println(br.getCount()); 
    } 

輸出

1 
2 
3 
4 
5 

EJB規範說服務器維護會話bean的池,我增加val在一種情況下,重新查找希望得到一個新的實例,它似乎實例變量值保持

這怎麼可能?除非服務器每次都一直給我返回相同的實例,或者是。

我甚至試過它在一個循環中執行它並得到相同的結果。 可以在任何提供一些線索

+1

如果一次只有一個請求,那麼容器只需要創建一個bean實例。如果您在並行線程中運行多個客戶端,則應該看到有多個bean在運行。 –

+0

@湯姆安德森當然沒有。謝謝 – Sudhakar

回答

1

要進行測試,如果無狀態bean確實彙集,湯姆·安德森建議,我嘗試執行它的並行線程

客戶

ExecutorService service = Executors.newFixedThreadPool(10);   

for(int i=0; i<5;i++){ 
    Future future= service.submit(new MessengerClient("Thread "+i+" :")); 
    }   

service.shutdown(); 

輸出

Thread 0 :1 
Thread 1 :1 
Thread 3 :1 
Thread 4 :1 
Thread 2 :1 
Thread 1 :2 
Thread 2 :3 
Thread 3 :4 
Thread 4 :5 
Thread 0 :6 
Thread 1 :7 
Thread 2 :8 
Thread 3 :9 
Thread 4 :10 
Thread 0 :11 
Thread 1 :2 
Thread 2 :12 
Thread 3 :13 
Thread 4 :14 
Thread 2 :15 
Thread 1 :16 
Thread 3 :17 
Thread 4 :18 
Thread 0 :19 
Thread 0 :20 

嗯,這證明了線程正在使用新實例

1

它給正確的輸出,referred from this link,它說

在無狀態豆,客戶端可以調用的 實例化的bean的任何可用的情況下,只要在EJB容器有 共享無狀態bean的能力。這使得bean的實例化數量減少,從而減少了所需的資源。

豆池是不 目前調用的任何無狀態會話bean的方法實例同樣適用於由EJB
容器或應用服務器調用服務的客戶端的請求。 這允許EJB容器共享無狀態bean實例並提高性能。

可擴展性由於無狀態會話bean能夠爲多個客戶端服務 ,當應用程序擁有大量客戶端時,它們往往更具可擴展性。與有狀態會話bean相比, 無狀態會話bean通常需要較少的實例化。

性能EJB容器決不會將無狀態會話bean 從RAM移出到輔助存儲,它可能會使用有狀態的 會話bean;因此,無狀態會話bean可能會提供比有狀態會話Bean更高的性能 性能。

閱讀更多關於difference between stateless and stateful session beans ...