什麼時候用有狀態session bean,什麼時候用無狀態session bean (轉)
什麼時候用有狀態session bean,什麼時候用無狀態session bean
最近,有關於無狀態的許多大驚小怪。無狀態的缺陷常常被誇大,
它的優點也一樣。許多無狀態的支持者盲目的宣稱無狀態能帶來
更大的伸縮性;而有狀態的支持者爭論說必須為了適應無狀態
而重建整個。真實的情況是什麼呢?
透過正確地設計,無狀態有以下兩個優點:
1.使用stateless bean,容器能容易的pooling和重用bean,
允許少量的bean去服務很多客戶端。用stateful bean去做同樣
的事情時,bean的狀態在方法之間必需要鈍化和活化,可
能導致I/O瓶頸。所以無狀態的一個實際的好處是使用很小的
開銷來容易的pool和重用。
2.因為一個stateful session bean在中緩衝一個客戶端
的對話,一個bean失敗可能導致失去你的對話。這能導致嚴重
的反響,如果你不在寫bean時考慮到這一點,或者你不使用一
個提供有狀態恢復的EJB產品。在一個無狀態模型裡面,請求
能被透明的重到一個不同的元件,因為任何元件都能為
客戶端的需要提供服務。
最大的無狀態的缺點是你需要在每個方法呼叫中把客戶相關的
的資料推到stateless bean。大多數stateless session bean
將需要接收對一個客戶端特定的一些資訊,如對banking bean的
銀行帳戶號碼。這些資訊要每次一個客戶端請求到達時被提供到
stateless bean,因為bean不能對一個特定的客戶端保持狀態。
一種向bean提供客戶相關的資料的方法是把資料作為引數傳到
bean的方法中。這可能導致下降,然而,只是發生在傳遞的
資料量很大的情況下。這也阻塞了,降低了其他程式的頻寬。
另一種為stateless bean提供客戶相關的資料的方法,為那個
bean為一個客戶端永續性的資料。客戶端不需要在一個方法
呼叫中傳遞所有的狀態,而只簡單的需要從持久化的storage得到
資料。這裡的trade-off又是效能:儲存對話持久化的能得到儲存
I/O瓶頸,而不是網路I/O瓶頸。
再一種超越無狀態的限制的方法是使用JNDI去儲存客戶相關資料
到一個目錄結構。客戶端能夠等一會傳給bean一個在目錄結構定位
資料的標識。這和儲存資料到很相似。比較大的區別是JNDI
實現能是一個in-memory實現(和共享屬性管理器有相同作用,對
com+讀者來說應該很熟悉)。如果資料存在記憶體中,沒有資料庫會
碰上。
當從有狀態和無狀態之間選擇,你應該問你自己商業程式展開
多呼叫,需要一個對話?如果是這樣,有狀態模型應該很合適因
為客戶相關的對話能成為bean狀態的一部分。相反,如果你的商業
程式變成一個方法呼叫,無狀態能更適合你的需要。
注意如果你要去使用狀態,並且你要去建一個基於的系統,
你可能可以用一個的HttpSession去做到這一點,和
stateful session bean大致一樣。該用stateful session bean
而不是HttpSession的情況如下:
1.你需要一個事務感知的有狀態物件。你的session bean能用
SessionSynchronization來做到這一點。
2.你既有基於web的也有不基於web的客戶端來存取你的EJB層,
而且都需要狀態。
3.你在使用一個stateful session bean來暫時儲存一個商業程式
的暫時狀態,這發生在牽扯到多個bean的單個Http請求中。
綜上所述,大多數先進的deployment要有複雜而有趣的有狀態的
和無狀態的組合。使用對你的商業問題最合適的。一個例外是如果
有一個明顯的瓶頸,如保持成兆的狀態在記憶體中。而如果你在選擇
有狀態還是無狀態,你會發現有狀態可能不是你的首要問題:直到
你測試你的程式碼,你還在黑暗中亂開槍。如果有狀態是你的瓶頸,
如果有必要,你可以重構你的程式碼。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001080/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- session的狀態什麼時候是snipedSession
- 無狀態session bean為什麼不像spring中一樣,採用singleton模式SessionBeanSpring模式
- session是什麼時候建立的Session
- Spring Bean Scope 有狀態的Bean和無狀態的BeanSpringBean
- C++中什麼時候用move,什麼時候用forward?C++Forward
- EJB2.0中什麼時候用local interface,什麼時候用remote interface (轉)REM
- 在得到ejb遠端物件時,能否傳引數給無狀態session bean?物件SessionBean
- 什麼時候採用socket通訊,什麼時候採用http通訊HTTP
- 什麼時候該用vuex?Vue
- 什麼時候該用MongoDB?MongoDB
- 關於有狀態和無狀態會話bean的解釋 (轉)會話Bean
- jquery裡面的$(this)和this都什麼時候用,有什麼區別jQuery
- "Spring 1.x無容器Session狀態支援"到底什麼意思?SpringSession
- Python的類什麼時候用Python
- oracle 什麼時候才回收v$session 中status='KILLED'的程式OracleSession
- 什麼時候用linux系統多Linux
- 舉例說明你什麼時候會用抽象類,什麼時候更願意使用介面?抽象
- 什麼時候釋出
- 什麼時候呼叫layoutSubviewsView
- 請教各位大俠,如果查詢一個已建立的有狀態session bean?SessionBean
- 無狀態會話bean的疑問會話Bean
- http狀態碼是什麼,有什麼用,在哪裡檢視,分別代表什麼意思?HTTP
- 什麼是介面?為什麼使用介面? 什麼時候使用介面?(轉)
- steam雲狀態無法同步怎麼辦 steam雲狀態無法同步會有什麼影響
- 新版什麼時候釋出?
- 到底什麼時候使用mqMQ
- TRIZ課堂—什麼時候可以用分割原理?
- 什麼時候該採用結對程式設計?程式設計
- C++ 靜態變數什麼時候完成初始化C++變數
- Gavin King為有狀態Bean SFSB平反Bean
- Haskell程式設計精華:什麼時候該註釋,什麼時候不該註釋Haskell程式設計
- 【Oracle】-【v$session】v$session的SNIPED狀態OracleSession
- 什麼是hibernate懶載入?什麼時候用懶載入?為什麼要用懶載入?(轉)
- beego 什麼時候支援grpcGoRPC
- python什麼時候縮排Python
- Mybatis什麼時候需要宣告jdbcType?MyBatisJDBC
- 什麼時候使用z-index?Index
- 什麼時候使用 Lambda 函式?函式