J2EE 探索: 有狀態網絡的 J2EE 技術選擇合適解決方案的最佳實踐 ![]() |
? |
![]() |
級別: 初級
Kyle Gabhart
, 高級顧問, LearningPatterns
2003 年 5 月 12 日 J2EE 中的 Java servlet 和 Enterprise JavaBeans 組件都提供了有狀態服務器端處理。兩種技術各有千秋,每種技術都比其它技術更加適合于某些應用程序設置。為了幫助您為您的企業選擇合適的解決方案,LearningPatterns 的高級顧問 Kyle Gabhart 比較了這兩種技術,并評估了它們在一些常見的有狀態應用程序方案中的性能。<!----><!----><!----> 在 J2EE 探索 系列的 第一部分 中,我們首先研究了 J2EE 中狀態管理的最新技術。上個月,我們討論了 J2EE 中管理無狀態網絡的最佳選項;這個月我們將討論管理有狀態網絡的技術。 首先我將簡要介紹有狀態應用程序管理,然后談論不同的解決方案如何應用于 Web 層或業務層。接下來,我將比較 J2EE 中有狀態應用程序管理技術的優缺點。就象在前一部分中一樣,我們將通過研究每種技術最常用的一些實現,以及用于為您的企業選擇合適解決方案的一些最佳實踐來結束本文。 請注意,對于本文而言,JSP(Java ServerPages)文件被認為是專用類型的 servlet。 您可能會回想起來,在上一篇文章中,Web 應用程序協議被分成兩大類別: 無狀態(stateless) 和 有狀態(stateful) ,協議的 狀態 指的是它“記憶”從一個傳輸到下一個傳輸的信息的能力。因為有狀態連通性是大多數企業應用程序的基本需求之一,并且因為 Web 應用程序依賴于 HTTP(內在的無狀態協議),所以聰明的開發人員已經找到了許多技巧來在 HTTP 上模擬有狀態連接。有狀態信息可以存儲在 HTML 表單字段中、附加到超鏈接或者存儲在客戶機端的 cookie 中。
客戶機和服務器之間的有狀態交互可以在 Web 層或業務層上進行管理。要在 Web 層上管理狀態,我們使用與
Servlet 體系結構的
因此,
由 Servlet 體系結構創建的輕量級線程模型決不會因為 servlet 或 JSP 文件創建、讀取或修改
J2EE 為在業務層上處理狀態提供了內置的支持。與無狀態會話 bean 一樣,有狀態會話 bean 也被映射到業務過程。兩者之間的關鍵區別是:無狀態 bean 及其數據在單個客戶機請求的生命周期內存活,而有狀態 bean 卻維護與客戶機的對話并且它們的數據跨多個請求持續存在。與 servlet 不同,有狀態會話 bean 不需要任何特殊的對象,也不需要使用額外的接口來創建有狀態連接。EJB 容器提供了所有有狀態會話 bean 管理。對于 bean 而言,所有必要的工作就是在其部署描述符中將其聲明為
正如以前闡述的,會話 bean 是最輕量級類型的企業 bean 類型。特別地,無狀態會話 bean 可以方便地被容器合用,因為它們只需要維護每個請求的狀態。 相反,有狀態會話 bean 與容器資源并不那樣友好。有狀態會話 bean 的池不能象無狀態 EJB 組件的池那樣用來容納任何客戶機請求。有狀態 bean 只能處理來自一個客戶機的請求,直到該客戶機釋放其對那個特殊 bean 實例的控制。有狀態會話 bean 消耗了容器的大量時間和內存。為了保存客戶機調用之間的 bean 狀態,容器必須將 bean 實例保存在活動內存中,或者臨時將狀態寫到持久性存儲(如文件系統或數據庫)中。將狀態分配到持久性存儲中就是所謂的 鈍化(passivation) 。當以前鈍化的企業 bean 被再次請求時,容器通過從池中檢索 bean,并且利用鈍化前 bean 的持久性狀態對它進行初始化,來激活它。下圖闡明了有狀態會話 bean 的鈍化和激活: 圖 1. 有狀態會話 bean 的鈍化/激活
決定將 bean 保存在內存中還是對它進行鈍化,然后再激活它,這取決于各個供應商。盡管在釋放容器資源方面鈍化機制非常有幫助,但是在防止服務器崩潰以避免丟失有狀態會話 bean 的活動狀態方面卻無能為力。盡管一些供應商提供了會話恢復功能以解決這個問題,但它不是標準的,因此依賴該功能會降低應用程序的可移植性。但是,別擔心!EJB 規范確實定義了一個接口(
從性能的角度看,servlet 和無狀態會話 bean 是相當具有競爭力的技術。它們都可以使用實例池為來自客戶機的請求提供服務。但是,當您添加了應用程序狀態管理時,巨大的性能差異就將顯現。與可用作 Servlet 體系結構一部分的輕量級
與無狀態的 J2EE 體系結構不同,J2EE 應用程序不提供典型的配置來充當指南或藍圖。管理狀態時,合適的體系結構取決于下列因素:
盡管上述一些問題似乎明顯地傾向于其中一種技術,但是許多有狀態方案實際上既需要使用 servlet 又需要使用 EJB 組件。至關重要的決定就是確定是在 Web 層還是在業務層上管理狀態,或者同時在兩個層上管理狀態。在下一節中,我們將研究一些可能的企業應用程序方案,及其最適宜的解決方案。 標準的應用程序客戶機是與另一個系統或組件相互操作的客戶機。我們將研究三種典型的應用程序客戶機方案,并且討論每個客戶機最適合的有狀態解決方案:
正如我們 上個月 討論的,無狀態會話 bean 是為電子商務隨需應變(e-business on demand)應用程序精心設計的。它們是非常輕量級的,可以輕松地匯聚為池,以確保卓越的可伸縮性。相反,有狀態會話 bean 并不是為這類應用程序而精心設計的。電子商務隨需應變應用程序中通常需要狀態管理,但是最好由專用的機制或通過 J2EE 事務進行處理。另一種可能性是調用 EJB 組件,就好象它是 CORBA 組件一樣。當一個或多個被集成的應用程序是 CORBA 組件時,該選項特別有用。 有三種基本的“富”GUI(不是 HTML,也不是命令行)客戶機類型:Java applet、獨立應用程序和 Java Web Start。下列解決方案適用于這三種“富”GUI 組件類型中的任何一種:
如果您正在使用本機 GUI 客戶機,并且需要管理復雜的事務或事務系列,那么您應該再次考慮調用 EJB 組件,就象它是 CORBA 組件一樣。如果不能那樣做,您可以始終讓客戶機通過 HTTP 與 servlet 通信,并且相應地管理會話。 在標準的、基于 Web 的應用程序情形中,客戶機位于防火墻的哪一側并不重要;使用 servlet 是必需的。因為您將使用 HTTP 作為傳輸協議,所以將在 Web 層上工作。唯一實際的決定 ― 是否在幕后使用 EJB 組件 ― 將取決于對 EJB 容器服務的相關需求。首先,您將選擇通用的組件類型(如 servlet 和會話 bean)。接下來,您將選擇一些匹配應用程序的用戶界面顯示和業務請求處理需求的更特定類型(如 JSP 頁面和有狀態會話 bean)。就所關心的狀態管理而言,Web 應用程序中存在著和其它客戶機類型中類似的問題。一些標準問題(和答案)將有助于您為您的 Web 應用程序確定合適的狀態管理解決方案:
最后的情形需要客戶機類型的組合,例如基于 Web 的瀏覽器和標準的“富”GUI 桌面。在這種情形下,有狀態選項同無狀態選項沒有區別。請參考 本系列的第一篇文章 以獲取詳細信息。
在本部分( J2EE Pathfinder 系列的第二部分)中,我們探討了使用 Java servlet 和有狀態會話 bean 來執行客戶機請求和提供有狀態體驗的相對優缺點。本文討論的方案并未包含所有情形,但是它們代表了有狀態通信環境中的 servlet 和會話 EJB 組件的一些最常見用法。 在下一部分中,我們將開始有關持久數據管理的兩部分探討,首先將比較實體 bean 和 JDBC。愿我們到時“探索”愉快!
|
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
