企業應用一般都需要連接數據庫,自從有了應用服務器之后,應用連接數據庫就可以利用數據庫連接池的方式來提高性能?;贘2EE的WEB應用一般是通過JDBC的方式來訪問數據庫,而且大部分都是通過數據源的方式來得到數據庫連接的。
WebSphere應用服務器(WAS)自從3.5版本便開始支持JDBC2.0,并支持用JNDI的方式來查找數據源然后生成數據庫連接。我們在工作的過程中發現有相當多的用戶在配置和使用數據源時曾遇到各種各樣的問題。本文將介紹WAS 5.x版本中數據源的配置和使用方法,并結合實際客戶遇到的常見問題進行一些討論,以使更多用戶能在WAS上順利的配置和使用數據源。
1.簡單原理和背景介紹
1.1 什么是數據源?為什么要使用數據源?
我們先來看一下使用JDBC1.0的時候,一般是怎樣來連接數據庫的。
代碼片斷示例1:
java.sql.Connection con = null;
try {
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
con = java.sql.DriverManager.getConnection("jdbc:db2:DBName");
} catch (Exception e) {
System.err.println("Exception: " + e.getMessage());
}
由于建立一個數據庫連接是一種比較耗時的操作,在使用JDBC1.0的時候,如果要提高性能就需要應用程序自己對連接進行緩存處理。但是在JDBC2.0 以一個附加的 API 的方式引入了標準連接池的特性,這個 附加的 API 叫做 JDBC 2.0 可選包(也稱作 JDBC 2.0 標準擴展)。這樣對于支持JDBC2.0的數據庫(一般是指JDBC驅動程序支持),WebSphere應用服務器提供了連接池的支持。JDBC2.0 API 為連接池提供了一個客戶端和一個服務器端的接口。 客戶端接口是 javax.sql.DataSource,通常就是應用代碼用來請求一個緩沖了的數據庫連接的東西。這個數據源就是生成數據庫連接對象的工廠。服務器接口是 javax.sql.ConnectionPoolDataSource,通常是大多數應用服務器和數據庫JDBC驅動打交道的接口。
連接池可改進任何需要連接的應用程序(特別是基于 Web 的應用程序,Web 用戶的連接和斷開更為頻繁)的響應時間。因為連接池的實現,在客戶端調用 close()方法的時候實際上并不關閉連接,而是把連接返回到一個可重用連接的連接池中給其它客戶端使用。這樣就避免了任何重復打開和關閉數據庫連接造成的開銷,并且允許大量的客戶端分享相對較少的數據庫連接,從而提高數據庫操作的性能。為了使用應用服務器提供的連接池功能,我們需要先定義相應的數據源。數據源在WebSphere應用服務器中作為資源存在,因此可以統一通過JNDI來查詢它們。
使用數據源的代碼片斷示例2:
try{
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("jdbc/DSName");
java.sql.Connection con = ds.getConnection();
}catch(javax.naming.NamingException e1){
System.err.println("Naming-Exception: " + e1.getMessage());
}catch (java.sql.SQLException e2) {
System.err.println("Naming-Exception: " + e2.getMessage());
}
使用數據源的另一個好處是安全性的提高。在不使用數據源的情況下,我們一般通過下面的代碼來連接Oracle數據庫。
代碼片斷3:
//裝載JDBC驅動程序
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//設置數據庫連接字符串
java.lang.String strConn = "jdbc:oracle:thin:@hostname/IP:1521:SIDName";
//連接數據庫
java.sql.Connection sqlConn =
java.sql.DriverManager.getConnection(strConn,"userName","passWord");
這種方式需要把數據庫的用戶名和口令放在程序的源代碼中。而在WebSphere應用服務器中我們可以在定義數據源的時候通過J2C認證的方式配置數據庫訪問別名,從而提升安全性。另外,這種方法也更靈活,如果數據庫用戶名或口令發生變化不需要更改應用程序代碼。
1.2 WebSphere應用服務器中數據源所處的位置
很多人在剛開始配置WebSphere應用服務器數據源時對J2C認證別名很不習慣,覺得JDBC的東西怎么會與J2C扯上關系。我們知道基于J2EE的WEB應用在與后臺EIS(企業信息系統)集成的過程中,根據EIS的不同主要有三種連接方式,分別是JDBC,JCA/J2C和JMS。從理論上講,JDBC驅動程序是可能歸納成一種特殊的JCA連接器,只不過這個連接器后面恰好連接著關系型數據庫。至于實際標準如何發展,讓我們拭目以待。下面我們看一下WebSphere應用服務器中數據庫連接及持久性管理的示意圖。
2.如何在WebSphere應用服務器中配置數據源
我們首先概要的看一下在WebSphere應用服務器中配置和使用數據源所涉及的幾個環節。一般的,配置數據源的基本步驟如下:
首先要確認所用的數據庫是支持JDBC2.0的,并確保我們的操作系統環境設置為支持 JDBC 2.0。這是使用 WebSphere應用服務器創建的數據源所必需的。這一點在使用UDB DB2 7.2的時候尤其要注意。
要確定使用哪個數據源:數據源V4.0還是 V5.0 數據源。
數據源V4.0是使用 WebSphere 舊連接管理器體系結構的 WebSphere 4.x 中的數據源,所有的 EJB1.x 模塊都必須使用此數據源。 WebSphere應用服務器5.x提供對 V4.0 的 JDBC 連接管理器模型的支持,使得 J2EE 1.2 應用程序能夠不經改變地運行。WAS 5.x 也支持J2EE 1.3的應用, J2EE 1.3 應用程序內的 EJB 2.0 模塊,WEB 2.3模塊需要使用 V5.0的JDBC 連接管理器。
創建 JDBC 提供程序。JDBC提供程序指的是JDBC驅動程序的類型及其相應的驅動程序實現JAVA包。
創建數據源。數據源是在提供特定 JDBC 驅動程序實現類的 JDBC 提供程序下創建的。
綁定資源引用。J2EE 1.3標準推薦使用數據源的引用而不是直接使用數據源的名稱。
測試連接。WebSphere應用服務器5.0.x及5.1提供了數據源配置頁面上提供了測試數據源連接的測試按鈕。
接下來,我們對數據源配置中的最為重要的兩步,即創建 JDBC提供程序時的配置步驟和創建數據源時的配置過程進行詳細描述。
2.1 配置JDBC提供程序
如果是第一次配置數據源連接,需要配置JDBC提供程序。配置JDBC提供程序的步驟如下:登錄WAS管理控制臺頁面,單擊資源 -> JDBC 提供程序 -> 選擇相應的作用域 -> 新建 -> 選擇相應的JDBC提供程序類型。
2.1.1 選擇JDBC提供程序的作用域
指定JDBC提供程序的作用域,如下圖所示。
的設置取決于實際WebSphere應用服務器的拓撲結構。一般有以下三種作用域:
單元
最常規的作用域。在“單元”作用域上定義的資源對于所有節點和服務器都是可見的,除非它們被覆蓋了。要查看單元作用域中定義的資源,不要在作用域選擇表單中指定服務器或節點名。
節點
多數資源類型的缺省作用域。在“節點”作用域上定義的資源覆蓋任何在“單元”作用域上定義的重復項,并且對于相同節點上的所有服務器都是可見的,除非它們在該節點上的服務器作用域中被覆蓋了。要查看節點作用域中定義的資源,不要指定服務器,但是要在作用域選擇表單中選擇節點名。
服務器
定義資源的最特定作用域。在“服務器”作用域上定義的資源覆蓋任何在“單元”作用域或父“節點”作用域上定義的重復資源定義,并且它們僅對于特定服務器是可見的。要查看服務器作用域中定義的資源,在作用域選擇表單中指定服務器名和節點名。
以看出上面三個作用域的范圍逐漸遞減,并且同名的資源以最小范圍的為準。這個有點類似編程語言中變量的作用域。根據上面作用域的范圍的描述,在單節點的情況下,一般選用“節點”。如果只有一個應用服務器實例也可以選擇“服務器”。在多個節點構成的單元中,可以分別在每個節點上分別定義,也可以選擇“單元”作用域一次性定義。
2.1.2 選擇JDBC提供程序
使用下拉列表選擇要創建的 JDBC 提供程序類型,如下圖所示。
如果支持的 JDBC 提供程序類型列表不包含我們要使用的 JDBC 提供程序,則選擇用戶定義的 JDBC 提供程序(User-defined JDBC Provider)。如果數據源需要兩階段提交(2PC)的支持,那么在選擇JDBC驅動程序時需要選擇帶XA支持的驅動程序。請查詢 JDBC 提供程序供應商文檔以獲取特定的必需屬性信息。
2.1.3 JDBC提供程序的屬性
JDBC提供程序的常規屬性頁如下圖所示:
這個頁面中最為重要的設置是類路徑。它是指定共同組成資源提供程序類的位置路徑或 JAR 文件名的列表,也即JDBC驅動程序類包。大部分常見數據庫的JDBC驅動程序都以jar文件或zip文件的形式提供。例如 DB2 7.2的JDBC驅動程序文件名為db2java.zip,Oracle 8.1.7的JDBC驅動程序文件名為classes12.zip,Sybase 12的JDBC驅動程序文件名為jconn2.jar等。在WebSphere應用服務器5.1中,類路徑的缺省值反映了相應數據庫更新的JDBC驅動程序,例如Oracle 9i的ojdbc14.jar。類路徑缺省值中還帶有一個相應的WebSphere變量,我們可以用絕對路徑替換或定義此WebSphere變量的值。
實現類名指定 JDBC 驅動程序
原文轉自:http://www.anti-gravitydesign.com