移轉 Servlet、JavaServer Pages 或 Enterprise Session Bean 時的連線考量

如果您計劃升級至 WebSphere® Application Server 7.0 版或更新版本,並從 Java™ 2 Platform 1.2 版移轉應用程式, Enterprise Edition (J2EE) 對較新版本 (例如 1.4 或 Java Platform, Enterprise Edition (Java EE)) 的規格,請注意對於 1.2 版之後的應用程式元件,產品會以不同的方式來配置可共用和不可共用的連線。 對於某些應用程式,這種差別可能會導致效能降低。

負面的行為變更

由於 WebSphere Application Server 提供與 J2EE 1.2 規格所編碼的應用程式模組的舊版相容性, 當您移轉至 WebSphere Application Server 7.0 版或更新版本 時,您可以繼續使用第 4 版樣式資料來源,只要您只為 J2EE 1.2 模組配置第 4 版資料來源, 資料存取應用程式元件的行為不會變更。

如果您要採用更新版本的 J2EE 規格,以及移轉至 WebSphere Application Server 7.0 版或更新版本,則資料存取元件的行為可能會變更。 如果應用程式中包含的 Servlet、JavaServer Pages (JSP) 檔或 Enterprise Session Bean 是透過可共用連線在區域交易內執行,則特別容易發生此風險。 資料存取元件的行為變更會在這些應用程式使用連線時造成負面影響。

此變更會影響所有包含下列方法的應用程式:

  • RequestDispatcher.include()
  • RequestDispatcher.forward()
  • JSP 併入項目 (<jsp:include>)

問題症狀包括:

  • 階段作業停止回應
  • 階段作業逾時值
  • 連線耗盡
附註: 如果您是從 WebSphere Application Server 7.0 版或更新版本內的 J2EE 1.2 模組升級,您也可以在包含先前說明之元件和方法的應用程式中遇到這些症狀。

配置可共用和不可共用連線之間的抉擇

對於使用第 4 版資料來源的 J2EE 1.2 模組, WebSphere Application Server 會發出與 JSP 檔、Servlet 及 Enterprise Session Bean 的不可共用連線。 對於其他所有應用程式元件,則發給可共用連線。 然而,對於 J2EE 1.3 以及更新版本的模組,應用程式伺服器配發可共用連線給所有邏輯命名的資源(連結到個別參照的資源),除非您在個別的資源參照中將連線指定為不可共用。 在此情況下,使用可共用連線會產生下列效果:

  • 所有在使用者交易範圍外收到和使用的連線,在封裝方法返回之前,即使連線控點發出 close() 呼叫,也都不會返回到可用連線儲存區。
  • 所有在使用者交易範圍外收到和使用的連線,不會與其他元件實例共用(也就是其他 Servlet、JSP 檔或 Enterprise Bean)。 例如,Session Bean 1 取得連線,然後呼叫也取得連線的 Session Bean 2。 即使所有內容相同,每一個 Session Bean 只會收到自己的連線。

如果您未預先考慮到連線行為的這種變更,則您設計應用程式碼的方式可能會導致過度使用連線,尤其是在 JSP 併入項目、透過可共用連線在區域交易內執行的 Session Bean、RequestDispatcher.include() 常式、RequestDispatcher.forward() 常式,或從這些方法呼叫其他元件等方面。 結果,可能會發生階段作業停止回應、階段作業逾時或連線不足。

實務範例

Servlet A 取得連線、完成工作、確定連線,然後在連線上呼叫 close()。 接下來, Servlet A 會呼叫 RequestDispatcher.include() 來包含 Servlet B ,這會執行與 Servlet A 相同的步驟。 因為 Servlet A 連線在從現行方法返回之前不會回到可用儲存區,所以現在有兩個連線忙碌。 於是,應用程式中目前使用的連線可能比您預期的更多。 如果這些連線未算入連線儲存區的 Max Connections 設定中,此行為可能會造成儲存區中的連線短缺,導致 ConnectionWaitTimeOut 異常狀況。 如果 connection wait timeout 未啟用,或 connection wait timeout 設為較大的數字,這些執行緒可能會停止回應,因為它們一直等待的連線從未返回到儲存區。 如果沒有新的連線可用,則等待新連線的執行緒不會歸還它們目前正在使用的連線。

解決方法

如果要解決這些問題,請執行下列動作:

  1. 使用非共用連線。

    如果您使用非共用連線,而且不在使用者交易中,當您發出 close() 呼叫時(假設您確定或回復連線),連線會返回到可用儲存區。

  2. 增加連線數上限。

    如果要計算所需的連線數,請將已配置的執行緒個數乘以元件巢狀呼叫的最深層次(針對使用連線的那些呼叫)。 如需巢狀呼叫的說明,請參閱 範例實務 一節。