企业应用一般都需要连接数据库,自从有了应用服务器之后,应用连接数据库就可以利用数据库连接池的方式来提高性能。基于J2EE的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 驱动程序