天天看點

有狀态會話Bean和無狀态會話Bean的差別

    Session   Bean   主要的目的是讓程式開發者将邏輯層抽離;

    Entity   Bean   主要是資料元件,  Entity   Bean   主要的目的,在于提供資料,也就是說程式設計師可以将   Entity   Bean   當程式資料;

     Message   Driven   Bean   與   Session   Bean   或是   Entity   Bean   均不相同,一般   Session   Bean   或是Entity   Bean   都可以讓使用者主動觸發,但是   Message   Driven Bean   主要的目的在于反應   Message   Queue   中的事件。也就是當   Message   Queue   中有訊息傳入時,   Message   Driven   Bean   可以主動被觸發,做出相對應的反應。

有狀态會話Bean(SLSB) 和無狀态會話Bean(SFSB)的差別

  1   無狀态   (Stateless)   

      在不同方法調用間不保留任何狀态   。

      事務處理必須在一個方法中結束   。

      通常資源占用較少;可以被共享(因為它是無狀态的)  。

      無狀态Bean不會"專門"儲存用戶端的狀态----(需要強調“專門”是因為無狀态會話Bean也會有成員變量,有成員變量就可以儲存狀态,但它不會專門為特定的用戶端儲存狀态。)。

      ----你對ENTITY   BEAN的資料操作不會被容器維護,當其他的使用者要用ENTITY   BEAN時,裡面的資料不

會被鈍化到伺服器的磁盤上。也就是被儲存起來。

  2   有狀态   (Stateful)   

      可以在不同的方法調用間保持針對各個用戶端的狀态   。

      與用戶端的聯系必需被維持;通常開銷較大  。

      有狀态會話Bean會儲存用戶端的狀态 。

      --你對ENTITY   BEAN的資料操作會被容器維護起來,當其他的使用者要用你正在使用的ENTITY   BEAN時,裡面的資料會被鈍化到伺服器的磁盤上,例如網上的購物車。

差別的根本原因 這與無狀态會話Bean和有狀态會話Bean的運作原理是相關的。 對于有狀态會話Bean來說,隻要有用戶端發送對有狀态會話Bean的通路,伺服器都會建立一個會話Bean執行個體與該用戶端對應,這樣這個執行個體與這個用戶端就是一一對應的。如果用戶端在Bean執行個體中儲存了資訊,之後還可以使用。 對 于無狀态會話Bean來說,伺服器端會維持一個執行個體池,建立好若幹個執行個體對象供用戶端調用。當從用戶端發送建立會話Bean的請求時,并不一定會真的建立 EJB,多數情況下是從執行個體池中得到一個執行個體,用完之後重新放回執行個體池。如果下次再通路,再從執行個體池中取出一個執行個體使用,并不一定是上次的執行個體。即使兩次 通路使用的是同一個執行個體,在兩次通路之間也有可能有其他的用戶端通路了該執行個體。是以,并不能保證在多次通路之間的資訊會被儲存。是以,無狀态會話Bean 不會專門儲存用戶端的資訊。 各自的優缺點 因 為有狀态會話Bean需要儲存特定用戶端的資訊,一個用戶端對應一個執行個體,既是在當時用戶端有連接配接沒有通路的情況下,也要為這個用戶端保留這個執行個體。這樣 随着用戶端數量的增加,伺服器端需要建立的執行個體的數量也在增加,增加到一次程度對伺服器的性能就會有一定的影響。為了不對伺服器的性能産生影響,通常服務 器會進行一些優化。當用戶端的數量超過某個值之後,就不建立新的執行個體。雖然不建立新的執行個體,還是需要對使用者響應,這時候就采用共享執行個體的方式。會檢視哪個 執行個體雖然處于連接配接狀态,但是沒有通路,然後把這個執行個體的狀态儲存起來,使用這個執行個體為新的請求服務,對于原來的用戶端來說,稱為挂起。如果原來的用戶端又 發送請求了,會重新查找一個空閑的執行個體并且把已經儲存好的狀态恢複回來,這個過程稱為激活。是以在有狀态會話Bean的通路過程,經常會發生查找執行個體,激 活挂起等操作,是以效率比較低。 而發送對無狀态會話Bean的請求的時候,可以随便取一個空閑的執行個體為用戶端服務,是以效率比較高。 有狀态會話Bean的好處是,可以儲存用戶端的狀态,是以用戶端在後續通路的時候就可以少傳遞一些參數。而狀态會話Bean需要傳遞方法執行過程中需要的所有參數。 如何選擇 根據上面分析的有狀态會話Bean和無狀态會話Bean的優缺點。如果要頻繁的通路,并且多次通路之間會共享一些資訊,這時候應該使用有狀态會話Bean。對于不經常使用的功能,可以使用無狀态會話Bean。無狀态會話Bean的使用要比有狀态會話Bean的使用多。

繼續閱讀