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

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