移轉 Servlet、JavaServer Pages 或 Enterprise Session Bean 時的連線考量
如果您打算升級至 WebSphere® Application Server 7.0 版或更新版本,並將應用程式從 Java™ 2 Platform Enterprise Edition (J2EE) 規格 1.2 版移轉至更新版本,例如 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 版資料來源,則資料存取應用程式的行為就不會變更。
不過,如果您在移轉至 WebSphere Application Server 7.0 版或更新版本時採用最新版的 J2EE 規格,則資料存取元件的行為會變更。 如果應用程式中包含的 Servlet、JavaServer Pages (JSP) 檔或 Enterprise Session Bean 是透過可共用連線在區域交易內執行,則特別容易發生此風險。 資料存取元件的行為變更會在這些應用程式使用連線時造成負面影響。
此變更會影響所有包含下列方法的應用程式:
- RequestDispatcher.include()
- RequestDispatcher.forward()
- JSP 併入項目 (<jsp:include>)
問題症狀包括:
- 階段作業停止回應
- 階段作業逾時值
- 連線耗盡
配置可共用和不可共用連線之間的抉擇
對於使用第 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 B 執行的步驟與 Servlet A 相同。因為 Servlet A 連線在從現行方法返回之前,不會返回到可用儲存區,所以現在兩個連線都很忙碌。 於是,應用程式中目前使用的連線可能比您預期的更多。 如果這些連線未算入連線儲存區的 Max Connections 設定中,此行為可能會造成儲存區中的連線短缺,導致 ConnectionWaitTimeOut 異常狀況。如果 connection wait timeout 未啟用,或 connection wait timeout 設為較大的數字,這些執行緒可能會停止回應,因為它們一直等待的連線從未返回到儲存區。 如果沒有新的連線可用,則等待新連線的執行緒不會歸還它們目前正在使用的連線。
解決方案
如果要解決這些問題,請執行下列動作:
- 使用非共用連線。
如果您使用非共用連線,而且不在使用者交易中,當您發出 close() 呼叫時(假設您確定或回復連線),連線會返回到可用儲存區。
- 增加連線數上限。
如果要計算所需的連線數,請將已配置的執行緒個數乘以元件巢狀呼叫的最深層次(針對使用連線的那些呼叫)。如需巢狀呼叫的說明,請參閱實務範例一節。