国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

開發(fā) Web 應用程序的快捷途徑介紹

2019-11-18 12:53:01
字體:
來源:轉載
供稿:網(wǎng)友

  共享物理連接
  共享一個連接只能在共享作用域中發(fā)生。最常見的共享作用域是多個活動的連接句柄可以共享同一物理連接的事務作用域。在 application Server V5 中有兩個事務作用域:全局事務和本地事務容器(Local Transaction Containment,LTC)邊界。
  
  全局事務可以是由 J2EE 應用程序啟動的用戶事務,或者是由 Application Server EnterPRise java Bean(EJB)容器所啟動的容器全局事務。當使用 Required 或 RequiresNew 事務屬性配置了 EJB 方法時,EJB 容器就啟動一個全局事務。當使用 Required、Supports 或 Mandatory 事務屬性配置了 EJB 方法時,EJB 容器也可以使用客戶端的全局事務。注重 EJB 的客戶端可以是 J2EE 應用程序、Servlet、jsp 或另一個 EJB。
  LTC 邊界與資源治理器本地事務(Resource Manager Local Transaction,RMLT)是有區(qū)別的,后者是本地事務的資源視圖。LTC 是一個作用域,在它里面可以訪問多個 RMLT。在沒有全局事務的時候,通常由容器來建立 LTC。LTC 的一個示例是含事務屬性 NotSupported 的 Bean 方法的執(zhí)行。 RMLT 的一個示例是將 autocommit 設置為 false,稍后再提交連接。
  在 Application Server 中,連接共享作用域是全局事務。雖然在 LTC 中調用多次 getConnection 可以返回具有同一物理連接的多個連接句柄,該物理連接被連續(xù)重用,但是并沒有被共享。此行為是"連接串行重用(connection serial reuse)。"后面將討論 LTC 中的連接串行重用。
  
  正如上面所提到的,假如一個應用程序的部署描述符元素 res-sharing-scope 被設置為 shareable,并且符合某些條件,那么在此應用程序中多次調用 getConnection 符合共享同一連接的條件。要讓一個共享作用域中調用多次 getConnection 返回同一物理連接,下列連接特性必須一致:
  
  Java 命名和目錄接口(Java Naming and Directory Interface,JNDI)名稱。 雖然 JNDI 名稱實際上不是一個連接特性,但是此必要條件表示您只能共享來自位于相同服務器進程的相同數(shù)據(jù)源的連接。您必須在應用程序服務器中的相同數(shù)據(jù)源上調用兩次 getConnection 調用以共享一個物理連接。
  資源認證設置。使用資源引用的資源認證設置來指定應用程序組件供給者如何將一個主體(用戶 ID 和密碼)聯(lián)系到一個資源治理器。對于非 CMP 應用程序,資源認證由 res-auth 部署描述符來標識。它的值是 Application 或 Container。Application Server 也為 CMP 連接工廠的資源認證提供一個 IBM 擴展。該設置由 IBM 部署描述符擴展文件 ibm-ejb-jar-ext.xmi 中的 resAuth 元素來標識。您可以將 resAuth 的值設置為 Per_Connection_Factory 或 Container。Per_Connection_Factory 與 res-auth 部署描述符的 Application 值一致。當兩個數(shù)據(jù)源或連接工廠引用與 Application Server 中的一個數(shù)據(jù)源相關聯(lián),那么在(并且僅在)這兩個引用擁有相同的資源認證值的情況下連接是可共享的。要查閱有關資源認證的描述,請參考 WebSphere Application Server V5 中的數(shù)據(jù)庫驗證。
  主體。相同的主題表示相同的用戶和密碼對于相關的數(shù)據(jù)庫是必需的。假如應用程序使用一個不同的用戶 ID 和密碼來獲取連接,那么從 getConnection 調用返回的物理連接將是不同的。當應用程序的資源認證設置被設置為 Application 時,您可以通過 getConnection() 或 getConnection(String userid, String passWord) 來獲取連接。請注重,即使與數(shù)據(jù)源相關聯(lián)的受組件治理的認證別名在所使用的 getConnection(String userid, String password) 中有相同的用戶 ID 和密碼,從這兩個調用獲取的連接也不是共享的。
  連接事務隔離級別特性。在 Application Server 中,您可以通過幾種方法來指定獲取的連接所使用的隔離級別:
  您可以使用訪問意圖來指定事務隔離級別。
  您可以使用 IBM 擴展(在 IBM 擴展文件中指定為 isolationLevel)來指定特定應用程序的數(shù)據(jù)源引用的隔離級別。
  您可以將事務隔離級別設置為 IBM 擴展 API(JDBCConnectionSpec),然后使用 WSDataSource.getConnection(JDBCConnectionSpec)來獲取連接。要共享同一物理連接,在一個給定事務中的多個 getConnection 調用的事務隔離級別必須是相同的。請注重,IBM 擴展 API-JDBCConnectionSpec 是一個私有 API。假如您使用這個 API,您的應用程序將不能轉換到其他應用程序服務器。
  連接 readOnly、catalog 和 typeMap 特性。正如同連接事務隔離級別,這三個連接特性對多個 getConnection 調用必須是相同的,以共享同一物理連接。應用程序可以使用 JDBCConnectionSpec 來指定這三個特性的值。
  假如上述必要條件中的一個沒有滿足,那么兩個 getConnection 調用將返回不同的物理連接。
  
  清單 1 顯示了在一個用戶事務中共享同一物理連接的兩個連接句柄。資源引用的資源共享作用域被設為 Shareable。連接 conn1 和 conn2 是從同一數(shù)據(jù)源 ds 獲取的兩個連接句柄。由于這兩個連接是在一個共享作用域(在本例中,是一個用戶事務)中獲取的,并且所有的共享必要條件都已滿足,所以 conn1 和 conn2 共享同一物理連接。
  
  假如將一個應用程序的部署描述符中的 res-sharing-scope 部署描述符元素設置為 Unshareable,那么這些連接不共享同一物理連接。在一個全局事務或 LTC 中的多個 getConnection 調用將返回包含不同物理連接的連接句柄。
  
  清單 1. 在一個用戶事務中共享連接
  
  // Start a user transaction
  userTransaction.begin();
  
  // Get the first connection
  java.sql.Connection conn1 = ds.getConnection();
  java.sql.Statement stmt1 = conn1.createStatement();
  ...
  
  // Get the second connection
  java.sql.conenction conn2 = ds.getConnection();
  java.sql.Statement stmt2 = conn2.createStatement();
  ...
  
  // Commit the user transaction
  userTransaction.commit();
  
  LTC 中的連接串行重用
  在一個本地事務容器(Local Transaction Containment,LTC)邊界中,您不能擁有多個使用同一物理連接的活動連接句柄。然而,假如前面的包裝相同物理連接的連接句柄已關閉,那么您可以重用該物理連接。在您使用如下模式時將發(fā)生連接重用:
  
  獲得連接 1 -> 使用連接 1 -> 提交/回滾連接1(可選) -> 關閉連接 1 -> 獲得連接 2 -> 使用連接 2 -> 提交/回滾連接 2(可選) -> 關閉連接 2 -> ...
  假設使用了相同的特性并且沒有將 res-sharing-scope 設置為 unshareable,那么從第二個 getConnection 返回的連接與從第一個 getConnection 返回的連接相同。因為連接的使用是串行的,在同一時間僅有一個到基礎物理連接的連接句柄,所以沒有發(fā)生真正的連接共享。因此,物理連接被"串行重用(serially reused)。" 請注重,在本模式中提交和回滾連接是可選的。也就是說,即使第一個連接沒有被提交或回滾,一旦前一連接已關閉,第二個 getConnection 仍然返回相同的物理連接。您必須注重下列語句隱藏的事務語義:"連接句柄 2 的回滾或提交將回滾或提交對連接句柄 2 所做的工作。它也將回滾或提交對連接句柄 1 所做的工作。"
  
  清單 2 顯示了在一個 LTC 中兩個連接句柄重用相同的物理連接。該代碼在一個 Web 應用程序(Servlet)中,或者位于在全局事務邊界內未執(zhí)行的 EJB 方法中。在沒有全局事務邊界的情況下,將建立 LTC 邊界。在本應用程序中,連接 conn1 從數(shù)據(jù)源 ds 獲得,然后連接 conn1 的 autocommit 值被設為 false。再將記錄 1 插入到數(shù)據(jù)庫中。在此之后,沒有經(jīng)過提交或回滾連接,連接 conn1 就被關閉了。然后從相同的數(shù)據(jù)庫 ds 獲得連接 conn2。由于用來獲得連接 conn2 的連接特性與用來獲得連接 conn1 的連接特性相同,并且連接 conn1 已關閉,所以連接 conn2 重用相同的物理連接。在此之后,conn2 的 autocommit 被設置為 false(重用連接,所以不需要將 autocommit 設置為 false,因為它已經(jīng)是 false),然后記錄 2 被插入到數(shù)據(jù)庫中。當回滾連接 conn2 時,不僅回滾了記錄 2 插入,同時也回滾了記錄 1 插入。
  
  清單 2. 在 LTC 邊界中重用連接
  
  // Get the first connection
  java.sql.Connection conn1 = ds.getConnection();
  conn1.setAutoCommit(false)
  java.sql.Statement stmt1 = conn1.createStatement();
  
  //use statement1 to insert record 1
  ... ...
  
  conn1.close();
  
  java.sql.conenction conn2 = ds.getConnection();
  conn2.setAutoCommit(false);
  java.sql.Statement stmt2 = conn2.createStatement();
  
  //use statement 2 to insert record 2
  ... ...
  conn2.rollback();
  conn2.close();
  
  編程模型
  共享連接使應用程序更具有可伸縮性。它減少了資源分配,還減少了出現(xiàn)死鎖情況的機會。然而,在共享連接時是有限制的。例如,不答應在可共享的連接上設置特性,這是因為一個連接句柄的用戶可能無法預見由其他連接句柄做出的更改。該限制是 J2EE 1.3 標準的一部分。
  
  在某些情況下,您不希望應用程序共享物理連接。一個原因在于該應用程序可能需要更改連接屬性,而那些更改對于可共享連接是不被答應的。然而,除了增加資源分配消耗之外,還有其他有關使用不可共享連接的約束。
  
  讓我們在此查看清單 1 中的代碼。假設數(shù)據(jù)源的資源引用被標記為 Unshareable。連接句柄 conn1 和 conn2 將有不同的物理連接。該應用程序在下

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 额尔古纳市| 庆元县| 上林县| 江阴市| 牡丹江市| 东丰县| 怀宁县| 六枝特区| 武强县| 芮城县| 霍城县| 当阳市| 库伦旗| 井冈山市| 高雄市| 焦作市| 平阳县| 中江县| 霍林郭勒市| 武夷山市| 金阳县| 炉霍县| 丹凤县| 庄浪县| 宁明县| 南乐县| 方正县| 五原县| 潞西市| 鹿邑县| 漾濞| 顺义区| 康乐县| 大丰市| 邢台市| 龙里县| 库伦旗| 吉木萨尔县| 柳州市| 永嘉县| 乌拉特中旗|