国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

J2EE組件開發:會話EJB

2019-11-18 16:05:18
字體:
來源:轉載
供稿:網友

  ===================================
  
  提綱:
  
  ===================================
  
  一、概述
  
  二、無狀態會話Bean
  
  三、有狀態會話Bean
  
  四、客戶端接口
  
    4.1 Remote接口
  
    4.2 Home接口
  
  五、實例
  
    5.1 有狀態會話Bean
  
    5.2 Home接口
  
    5.3 Remote接口
  
    5.4 部署描述器
  
    5.5 客戶程序
  
    5.6 運行
  
  ===================================
  
  正文:
  
  ===================================
  
  一、概述
  
  在企業級應用系統內,會話Bean是一種代表客戶程序執行操作的EJB。對于EJB客戶程序來說,會話Bean常常起著入口點或“前線”EJB的作用。EJB客戶程序通過與會話Bean的交互,從企業應用系統獲取它們想要利用的功能或服務。
  
  正如其名字所示,會話Bean類似于一個交互式的會話。會話Bean是不共享的,正如交互式會話只能有一個用戶,而且會話Bean也不具備持久化的特點(即它的數據不保存到數據庫)。一旦客戶程序結束運行,會話Bean也就不再關聯到客戶程序。
  
  會話Bean有兩種類型:有狀態會話Bean(Stateful session Bean),無狀態會話Bean(Stateless Session Bean)。
  
  有狀態會話Bean
  
  對象的狀態由實例變量的值描述。對于有狀態會話Bean,實例變量描述了客戶程序與Bean的會話的狀態。鑒于客戶程序與Bean的交互關系,Bean的狀態信息通常稱為會話狀態。
  
  在客戶程序與Bean交互期間,狀態信息一直有效。如果客戶程序運行結束或拆除了Bean,則會話結束,狀態信息也不再保留。然而,狀態信息的這種臨時性并不成為問題,因為當客戶程序與Bean之間的會話終止,狀態信息也就沒有必要再保存了。
  
  無狀態會話Bean
  
  無狀態會話Bean不為特定的客戶程序保留會話狀態。客戶程序調用無狀態Bean的方法時,Bean的實例變量可以包含狀態信息,但狀態信息僅在該次調用期間有效。當方法調用結束,狀態信息也就不再保留。除了Bean方法正在執行的時間之外,所有無狀態Bean的實例都是等價的,這使得EJB容器能夠把Bean的實例分配給任意客戶程序。
  
  由于無狀態會話Bean支持多個客戶程序,對于那些客戶程序數量很大的應用,無狀態會話Bean具有更好的可伸縮性。一般地,對于支持同樣數量的客戶程序來說,應用需要的無狀態會話Bean數量少于有狀態會話Bean數量。
  
  一些時候,EJB容器可能把有狀態會話Bean保存到第二級存儲設備,但容器永遠不會保存無狀態會話Bean。因此,無狀態會話Bean比有狀態會話Bean有著更好的性能。
  
  一般地,在下列情形下,我們可以使用會話Bean:
  
  
  在任意時刻只有一個客戶程序訪問Bean的實例。
  Bean的狀態無需持久化,只在短期內生存(比如幾個小時)。
  
  
  如果滿足任意以下條件,使用有狀態會話Bean比較合適:
  
  
  Bean的狀態描述了Bean與特定客戶程序的交互。
  Bean需要保留有關客戶程序的信息,且保留期限必須跨越多次方法調用。
  Bean擔負著客戶程序到應用其他組件之間的中間人的角色,為客戶程序提供一個簡化的服務視圖。
  Bean管理著多個EJB的工作流程。
  
  
  為提高性能,當Bean具有任意下面的特征之一時,最好選用無狀態會話Bean:
  
  
  Bean的狀態信息不包含任何針對特定客戶程序的數據。
  Bean從數據庫提取一組客戶程序經常使用的只讀數據。例如,Bean從數據庫提取出本月銷售的產品信息。
  
  
  二、無狀態會話Bean
  
  無狀態會話Bean不在EJB之內保留面向特定客戶程序的狀態信息,但這并不意味著這類EJB不在本身的域或關聯的對象里面保留任何狀態數據,其真實含義是,這類Bean保持的狀態信息不是為特定EJB客戶程序下一次訪問或使用而保留。
  
  這種特點使得EJB容器能夠更高效、更靈活地管理無狀態會話Bean。在任意時刻,任意一個客戶程序可以使用容器創建的任意一個無狀態會話Bean的實例。因此,容器可以為這類實例構造一個緩沖池,根據客戶程序的需求從緩沖池分配Bean的實例,無需顧慮哪一個實例屬于哪一個客戶程序。此外,必要時容器能夠方便地創建或拆除Bean的實例,根據應用規模和資源情況作出調整。雖然無狀態會話Bean可能擁有狀態信息,但在兩次對Bean實例的連續調用之間,開發者不能假定這些狀態信息的合法性。
  
  圖一顯示了無狀態會話Bean組件構造的基本體系結構。
  [[The No.1 Picture.]]
  位于圖一頂端的是javax.ejb.EnterPRiseBean接口,它是所有EJB的基礎接口。從EnterpriseBean接口派生出了javax.ejb.SessionBean接口。公用的、非最終的、非抽象的無狀態會話EJB,比如圖一顯示的MyStatelessSessionEJBean,必須實現javax.ejb.SessionBean接口。無狀態會話EJB實現公用的、非最終的、非抽象的業務方法,比如圖一顯示的someMethod()和anotherMethod()。實現會話Bean的類必須有一個公用的、不帶參數的構造函數,且不應該實現finalize()方法。
  
  無狀態會話Bean上定義的setSessionContext()方法用來把一個SessionContext的實例傳入EJB,它也是SessionBean接口上定義的第一個由容器調用的方法。SessionContext對象封裝了一個EJB會話容器上下文的接口,支持會話Bean的實例訪問容器提供的運行時會話上下文。在Bean實例生存期間,會話上下文將一直保持與Bean實例的關聯。
  
  對于無狀態會話Bean,盡管在SessionBean接口中沒有定義ejbCreate()方法,但它是一個關鍵的操作。無狀態會話Bean必須定義一個返回值為void的ejbCreate()方法,容器準備創建Bean的實例時將調用這個方法。容器決定創建Bean的實例可能是因為它要構造一個Bean實例的緩沖池,也有可能是因為它接收到了客戶程序的請求。因此,ejbCreate()方法屬于一種由EJB實現的特殊的構造函數或初始化方法。
  
  當容器決定不讓Bean的實例繼續處理客戶程序的請求時,它就會調用Bean實例的ejbRemove()方法。對于無狀態會話Bean,何時調用Bean實例的ejbRemove()方法由容器單獨決定,不受EJB客戶程序的任何影響。
  
  三、有狀態會話Bean
  
  有狀態會話Bean在EJB之內保留的狀態信息與EJB客戶程序有著明確的關系。有狀態會話Bean的狀態信息是指保存在Bean實例的域里面的數據,以及Bean實例持有的各種對象里面的數據。當一個EJB客戶程序在某一時刻訪問一個有狀態會話Bean,且改變了該Bean實例的狀態,則狀態信息將被保留,下一次Bean再次被訪問時,Bean的實例將使用原先保存的狀態信息。
  
  對于有狀態會話Bean,容器承擔著更多的Bean管理方面的責任。實際上,客戶程序創建或拆除有狀態會話Bean直接關系到服務器端Bean實例的創建和拆除。此外,當資源緊張時,容器可能決定把一個或者多個有狀態會話Bean串行化(也就是鈍化)到持久性存儲設備,一旦資源重新空閑,或出現了客戶程序的請求,被鈍化的Bean必須激活并轉入活動內存。因此,設計有狀態會話Bean時,開發者必須考慮更多的問題。
  
  圖二顯示了有狀態會話Bean組件構造的基本體系結構。
  [[The No.2 Picture.]]
  公用的、非最終的、非抽象的有狀態會話Bean,如圖二顯示的MyStatefulSessionEJBean,必須實現SessionBean接口。SessionBean接口從EnterpriseBean接口派生。另外,有狀態會話EJB也實現公用的、非最終的、非抽象的業務方法,比如圖二顯示的someMethod()方法和anotherMethod()方法。實現會話Bean的類必須有一個公用的、不帶參數的構造方法,且不應實現finalize()方法。最后,有狀態會話Bean可以實現javax.ejb.SessionSynchronization接口,使得Bean能夠收到某些事務管理方面的事件通知,但這是可選的。
  
  由于狀態信息對于有狀態會話Bean的重要性,創建Bean時初始化操作也很重要。有狀態會話Bean可以定義一個或者多個ejbCreate(...)方法,這些方法帶有零個或者多個輸入參數,方法的返回值類型是void。傳遞給這類方法的具體參數由應用本身決定,但方法的名字必須是ejbCreate()。與無狀態會話Bean上的ejbCreate()調用不同,有狀態會話Bean的ejbCreate()方法綁定到EJB客戶程序,EJB客戶程序將一直使用特定的EJB實例。另外也請注意,正如對于無狀態會話Bean,在調用任何ejbCreate()方法之前,容器將調用有狀態會話Bean的setSessionContext()方法。
  如果有狀態會話Bean的ejbRemove()方法被調用,則表明對應的客戶程序已經決定不讓該Bean繼續處理請求。另外,會話最大超時時間到達時,容器也會調用Bean的ejbRemove()方法。
  
  設計有狀態會話Bean的過程中,有時最重要的事情就是Bean的鈍化和激活操作。正如前面所指出的,容器鈍化某個Bean時,它將串行化Bean的內容,并把這些信息寫入某個持久性存儲設備。容器之所以鈍化Bean是因為內存資源不足。通常,容器通過某種形式的“最近最少使用”算法確定應該鈍化哪些Bean的實例(當然,實際所用的算法由具體的平臺決定)。
  
  在鈍化Bean的實例之前,容器會調用Bean的ejbPassivate()方法,有狀態會話Bean必須實現這個方法。在ejbPassivate()方法中,我們應該清除所有不能串行化和持久化的資源,比如數據庫連接和打開的文件句柄。ejbPassivate()方法執行完畢之后,所有仍未關閉的對象應該能夠被容器鈍化。
  
  如果出現了對已經

(出處:http://www.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛扎县| 定西市| 旬邑县| 许昌县| 郸城县| 苏尼特右旗| 瓮安县| 襄垣县| 隆子县| 白朗县| 广灵县| 阳春市| 西青区| 滕州市| 仪陇县| 温宿县| 张北县| 西乌珠穆沁旗| 桃园县| 上饶市| 平度市| 随州市| 阿勒泰市| 娱乐| 汤阴县| 吉林省| 陵川县| 仙游县| 高邑县| 沙雅县| 常宁市| 资阳市| 邢台市| 邮箱| 阿荣旗| 灵石县| 德阳市| 浮梁县| 岐山县| 桐乡市| 桂东县|