不可共用和可共用的連線
應用程式伺服器同時支援不可共用和可共用的連線。不可共用的連線不能與應用程式中的其他元件共用。使用此連線的元件完全掌控此連線。
存取標示為不可共用的資源時,就表示在元件所使用的連線控點和該控點相關聯的實體連線之間,存在著一對一的關係。 此存取意味著每次呼叫 getConnection 方法時,將僅針對發出要求的使用者傳回連線控點。通常,如果您對連線的操作,可能導致另一個共用此連線的應用程式發生非預期的行為(例如,意外地變更隔離層次),則您必須選擇不可共用。
將資源標示為可共用會提高可調整性。只要每個 getConnection 要求都具有相同的連線內容,就能透過多個連線控點來共用實體連線(亦即,受管理連線),而不必在每次呼叫 getConnection() 時都從連線儲存區擷取新的實體連線。 但是,共用連線就表示每一個使用者對連線的任何操作,都不可變更其行為及干擾共用夥伴(例如,變更隔離層次)。使用者在撰寫應用程式時也不可假定會進行共用,因為是由執行時期決定是否共用特定的連線。
連線內容需求
- Java™ 命名和目錄介面 (JNDI) 名稱。雖然實際上不是連線內容,但此需求只是表示您只能在相同伺服器中從相同的資料來源共用連線。
- 資源鑑別
- 在關聯式資料庫中:
- 隔離層次(對應於 CMP Bean 套用的存取目的原則)
- 唯讀
- 型錄
- 類型對映
如需與 CMP Bean 共用連線的相關資訊,請參閱「與 CMP Bean 共用連線」主題。
- JNDI 名稱。雖然實際上不是連線內容,但此需求只是表示您只能在相同伺服器中從相同的 Connection Factory 共用連線。
- 資源鑑別
IBM MQ JMS 提供者的 JMS 連線是非交易式,所以無法共用,而 Java™ EE 連接器架構 (JCA) 規格只容許共用交易式資源。 如果在 JMS 資源參照中將 res-sharing-scope 設定為 shareable,則會忽略此設定,而使用不可共用的連線。 不過,MQ 的 JMS 階段作業是交易式,可以共用。依預設,JMS 階段作業可共用,APAR PK59605 能夠指定不可共用的階段作業。
預設傳訊提供者的 JMS 連線不同。使用預設傳訊提供者時,可以共用連線。另一方面,階段作業不是由連線儲存區管理,因此,不能是可共用或不可共用。
與 CMP Bean 共用連線
- 在 CMP Bean 或方法之間共用連線
當所有 CMP Bean 方法都使用相同存取目的時,它們就共用相同的實體連線。不同的存取目的原則會觸發配置不同的實體連線。 例如,CMP Bean 有兩種方法;第一種方法與 wsPessimisticUpdate 目的相關聯,而第二種方法具有 wsOptimisticUpdate 存取目的。 第一種方法和第二種方法無法在交易內共用相同的實體連線。換言之,XA 資料來源必須在廣域交易中執行。
如果這兩種方法嘗試存取相同的表格,資料庫會發生死鎖狀況。因此,是否共用連線,取決於 CMP 方法中所定義的存取目的。
- 在 CMP Bean 和 BMP Bean 之間共用連線
請記得先驗證 BMP Bean 和 CMP Bean 的 getConnection 方法設定相同的連線內容。 如果要符合 CMP Bean 資源的鑑別類型,請將 BMP Bean 資源的鑑別類型設定為由儲存器管理,這在部署描述子中是以 res-auth = Container 指定。
此外,請使用下列其中一個選項來確保 Bean 類型之間共用連線:- 在 CMP Bean 方法和 BMP Bean 方法上定義相同的存取目的。 由於兩者使用相同存取目的,所以共用相同的實體連線。使用此選項的優點在於 BMP Bean 不需考慮後端。但是,由於此選項使用 WebSphere® 延伸 API 來處理隔離層次,所以也會使 BMP 變成不可攜。 如需相關資訊,請參閱「範例:使用 IBM® 延伸 API 存取資料,以在儲存器管理和 Bean 管理的持續性 Bean 之間共用連線」主題中的程式碼範例。
- 決定存取目的在 CMP Bean 方法上所使用的隔離層次,然後使用資源參照上指定的對應隔離層次,查閱資料來源和連線。 此選項大多需要手動處理,而且不同的資料庫可能有不同的隔離層次。如需相關資訊,請參閱「存取目的隔離層次和更新鎖定」主題中的隔離層次和存取目的對照表,以及「隔離層次和資源參照」主題。
- 在 CMP 和 Servlet 或階段作業 Bean 使用的 JDBC 應用程式之間共用連線。決定存取目的在 CMP Bean 方法上所使用的隔離層次,然後使用資源參照上指定的對應隔離層次,查閱資料來源和連線。 如需相關資訊,請參閱「存取目的隔離層次」主題及「隔離層次和資源參照」主題。
決定共用的因素
這裡未詳盡列出所有因素。在不同情況下,本產品不一定共用連線。- 只有以相同的資源參照 (resource-ref)(res-sharing-scope 指定為 shareable)獲得的連線,才有可能共用。res-sharing-scope 和 res-auth 的資源參照內容及 IBM 延伸 isolationLevel 可協助決定是否可以共用連線。
IBM 延伸 isolationLevel 儲存在 IBM 部署描述子延伸檔中;例如:ibm-ejb-jar-ext.xmi。
支援的配置: 對於 IBM 延伸和連結檔而言,.xmi 或 .xml 副檔名取決於您是使用 Java EE 5 之前的應用程式或模組,或 Java EE 5 或更新版本的應用程式或模組。 IBM 延伸或連結檔稱為 ibm-*-ext.xmi 或 ibm-*-bnd.xmi,其中 * 是延伸或連結檔的類型,例如:app、application、ejb-jar 或 web。 適用的條件如下:
不過,即使應用程式含有 Java EE 5 之前的檔案,且所用的副檔名是 .xmi,其中也可以有 Java EE 5 或更新版本的模組。
ibm-webservices-ext.xmi、ibm-webservices-bnd.xmi、ibm-webservicesclient-bnd.xmi、ibm-webservicesclient-ext.xmi 和 ibm-portlet-ext.xmi 檔會繼續使用 .xmi 副檔名。
sptcfg - 您只能共用以相同內容所要求的連線。
- 只有在交易(儲存器或使用者起始的交易)內的不同元件實例之間,才可共用連線。
- 只有在共用界限內才可共用連線。Current®共用界限包括Transactions 和 LocalTransactionContainment (LTC) 界限。
- LTC 範圍內的連線共用規則:
- 對於可共用的連線,單一元件實例中僅容許連線重複使用。對連線進行下列動作時會重複使用連線:取得、使用、確定/回復、關閉;取得、使用、確定/回復、關閉。
請注意,如果您使用的 LTC resolution-control 為 ContainerAtBoundary,則不需要啟動/確定,因為該動作由儲存器處理。
第二次取得傳回的連線與第一次取得傳回的連線相同(如果使用相同的內容)。因為連線是依序使用,一次只會使用基礎實體連線的一個連線控點,所以不會真正共用連線。 「重複使用」的說法更準確。
更為重要的是,括住兩次取得動作的 LocalTransactionContainment 界限不完整;在 ManagedConnection 物件上未呼叫 cleanUp() 方法。因此,第二次取得動作會繼承第一次 getConnection() 呼叫期間設定的所有連線內容。
- 對於可共用的連線,單一元件實例中僅容許連線重複使用。對連線進行下列動作時會重複使用連線:取得、使用、確定/回復、關閉;取得、使用、確定/回復、關閉。
請注意,如果您使用的 LTC resolution-control 為 ContainerAtBoundary,則不需要啟動/確定,因為該動作由儲存器處理。
- 交易(儲存器管理交易 (CMT)、Bean 管理的交易 (BMT) 或 LTC 交易)之間的可共用連線遵循以下快取規則:
- 一般而言,因為一個連線控點的使用者不可能預期到另一個連線控點所做的變更,因此不容許在可共用連線上設定內容。 此限制是 Java Platform Enterprise Edition (Java EE) 標準的一部分。
- 資源配接器的一般使用者可以在 Connection Factory getConnection() 呼叫中設定連線內容,只需在 ConnectionSpec 中傳遞這些內容即可。
然而,在一個交易期間於連線上設定的內容,不保證在下一個交易中使用時還是相同。因為在共用範圍外共用連線是無效的,所以交易結束時,連線控點會從目前相關聯的實體連線中移出。 該實體連線將回到可用連線儲存區。連線在回到可用儲存區之前會經過清理。 下次使用控點時,就會自動與適當的連線相關聯。適當性是基於安全性登入資訊、連線內容,以及延伸的資源參照中指定的隔離層次(針對 JDBC API),這些是在傳回現行控點的原始要求中傳入。擷取連線之後在連線上設定的任何內容都會遺失。
- 對於 JDBC 使用者,應用程式伺服器提供一項延伸,允許透過 ConnectionSpec 傳遞連線內容。
在區域交易範圍中設定內容和共用連線時必須謹慎。請確定共用連線的其他元件預期您的設定所產生的行為。
- 您無法在廣域交易中使用關聯式資源配接器,為 JDBC API 在可共用連線上設定隔離層次。本產品為資源參照提供一項延伸,可讓您指定隔離層次。如果您的應用程式需要使用多個隔離層次,請建立多個資源參照,再將它們對映至相同的資料來源或 Connection Factory。
最多連線共用機會
為了使應用程式擁有最多的連線共用機會,請確保每個元件的區域交易限制 (LTC) Resolver 屬性設定為 ContainerAtBoundary。 此設定指定元件儲存器(而非應用程式碼)在 LTC 範圍內解析所有資源管理程式區域交易 (RMLT)。當連線第一次在 LTC 範圍內使用時,儲存器會起始 RMLT,並於 LTC 範圍結尾時自動完成它。
如需有關設定交易解析控制和其他屬性的指示,請參閱「配置交易式部署屬性」主題。
連線共用違規
- 受管理連線的相關聯連線控點數目超過一。
- 受管連線與區域交易或 XA 交易相關聯。
根據受管連線變成不可共用的時間和方式,元件和 J2C 執行時期可能都需要偵測此共用違規異常狀況。 如果是由於透過連線控點的作業(例如,變更隔離層次),受管連線才變成不可共用,則元件必須處理此異常狀況。 如果應用程式伺服器未發覺受管理連線已變成不可共用(由於元件與連線控點的某些互動),則資源配接器可能發出共用違規異常狀況,而拒絕建立連線控點。