在EJB容器中,SessionBean主要有兩種:無狀態(stateless)和有狀態(stateful)。
1、無狀態EJB,類似Servlet,它只提供一個引用(Bean instance),被所有客戶端使用,不保留某個客戶的單獨信息。
例如:在某無狀態EJB中,有一個數據成員(變量) i_count (整型,用于訪問計數,初始值為0,訪問一次累加1),它是公共的。某客戶端訪問后,值累加為1。另一個客戶端訪問時是已經變化了的值為1。
2、有狀態EJB,類似數據庫的Connect鏈接,也類似線程守護,它提供引用池(Bean instance pool),每個客戶端會有單獨的信息。
例如:在某有狀態EJB中,有一個數據成員(變量) i_count (整型,用于訪問計數,初始值為0,訪問一次累加1),它對每個客戶端來說是隔離的。某客戶端訪問后,值累加為1。另一個客戶端訪問時還是原來的值為0。
這里提到的數據成員(變量) i_count ,在EJB規范中稱作:conversational state 。對它的要求也很多的,例如類型為 Serializable objects。還有,還要在ejbActivate(),ejbPassivate(),ejbRemove()等生命周期約定的方法中處理。詳見EJB規范吧。
我的感想:在看第一遍書時,還一點感覺都沒有,根本就看不明白SessionBean中的session與Servlet容器中的session有什么區別。
動手編程后,才感覺到EJB只是比Servlet更規范,更重量而已。真正的區別就是接口協議一個是基于HTTP,一個是基于RMI/IIOP。Servlet與無狀態的SessionBean在Session上是一樣的控制。Servlet中的Session對象與有狀態的SessionBean是一樣的控制。
對于應用,例如有一個購物車,要記錄正在采購的物品信息,沒有EJB時,我們一般是存在Servlet容器中的session中。有了EJB,則可以存儲在有狀態的SessionBean中,并且該次有狀態的sessionBean的instance還得保存在Servlet的session中。這樣的好處是:至少可以減輕Servlet容器的負載。
轉自:
http://zengabo.blogchina.com/blog/527365.html