企业应用一般都需要连接数据库,自从有了应用服务器之后,应用连接数据库就可以利用数据库连接池的方式来提高性能。基于J2EE的WEB应用一般是通过JDBC的方式来访问数据库,而且大部分都是通过数据源的方式来得到数据库连接的。 WebSphere应用服务器(WAS)自从3.5版本便开始支持JDBC2.0,并支持用JNDI的方式来查找数据源然后生成数据库连接。我们在工作的过程中发现有相当多的用户在配置和使用数据源时曾遇到各种各样的问题。本文将介绍WAS 5.x版本中数据源的配置和使用方法,并结合实际客户遇到的常见问题进行一些讨论,以使更多用户能在WAS上顺利的配置和使用数据源。. N1 Z) }8 u. G: Z0 m% n
% Z$ p) {1 j- v" b, i$ p. t 1.简单原理和背景介绍$ o- @# t l! ?; J& u5 ]1 d4 Y
1.1 什么是数据源?为什么要使用数据源?$ x u/ W+ s/ W' @
我们先来看一下使用JDBC1.0的时候,一般是怎样来连接数据库的。+ C: U" T$ @( {# o [: A
# T( ]* V0 Z9 z7 e" h 代码片断示例1:+ E ?7 g1 l' D. d$ V7 @7 D
% i& {2 ]: S" @' U$ _! ^
java.sql.Connection con = null.
' x! P$ m ?+ f9 l+ V4 N* Q try {
0 N; h! d. ~ s Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").
6 O+ N; w) H! Z0 S O+ n' \, o! @- r2 b' [ con = java.sql.DriverManager.getConnection("jdbc:db2:DBName").
! y8 S9 f, F3 ~* V, g& z3 r! I } catch (Exception e) { # v3 ~) A, I0 {' S, H
System.err.println("Exception: " e.getMessage()).
9 u1 t3 g+ P: D; ?3 k }
- ^1 V. \2 \- f; ]9 f! Q 由于建立一个数据库连接是一种比较耗时的操作,在使用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驱动打交道的接口。
1 C* a7 y! m& X; t ! j- p' s' B! M& _
连接池可改进任何需要连接的应用程序(特别是基于 Web 的应用程序,Web 用户的连接和断开更为频繁)的响应时间。因为连接池的实现,在客户端调用 close()方法的时候实际上并不关闭连接,而是把连接返回到一个可重用连接的连接池中给其它客户端使用。这样就避免了任何重复打开和关闭数据库连接造成的开销,并且允许大量的客户端分享相对较少的数据库连接,从而提高数据库操作的性能。为了使用应用服务器提供的连接池功能,我们需要先定义相应的数据源。数据源在WebSphere应用服务器中作为资源存在,因此可以统一通过JNDI来查询它们。
/ H/ W( \. O; K& H2 x, r 0 O5 ]6 E) D; [% A" e) W+ v
使用数据源的代码片断示例2:+ `+ M6 Q- @. V$ B
* ^6 e- E$ [& U0 |0 X5 x8 A try{5 }: V: m L z
javax.naming.InitialContext ctx = new javax.naming.InitialContext(). a4 x- e8 B, I1 p
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("jdbc/DSName").% M" r: a+ Y, a
java.sql.Connection con = ds.getConnection().& z; ?& U$ O1 o! ~# H
}catch(javax.naming.NamingException e1){ Y% Z1 F: s6 X" u' Q
System.err.println("Naming-Exception: " e1.getMessage()).9 J" U( R: G; d" q3 [+ w
}catch (java.sql.SQLException e2) {8 D0 G. l: G+ P) l( [
System.err.println("Naming-Exception: " e2.getMessage()).0 A' ?; y+ Y" M6 J, j7 N5 Y
}. Z" t) l6 L8 B' W' H
! j3 _9 I) [- ~% P 使用数据源的另一个好处是安全性的提高。在不使用数据源的情况下,我们一般通过下面的代码来连接Oracle数据库。, X$ o- {4 B- F7 P! m% ?
' ]$ Q4 e0 v$ @6 l
代码片断3:
+ c9 c( D6 H7 _( }# \4 D# G
% r" | v" ?: @! v) {4 `4 v //装载JDBC驱动程序 9 m+ ~0 ?6 W* }# Z$ Q
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()).
$ U* {; V2 e- j- L //设置数据库连接字符串 1 [0 U- f4 L) Q, V6 ?, i5 V4 Z% R
java.lang.String strConn = "jdbc:oracle:thin:@hostname/IP:1521:SIDName". / _6 Q& W5 s+ }) V. I& \/ _
//连接数据库
* S" ^; g9 ~6 O4 V( h java.sql.Connection sqlConn =
" ]* ]9 l' i. f+ f) ?0 Z9 { java.sql.DriverManager.getConnection(strConn,"userName","passWord").2 F$ C: E' z0 H5 c
4 K. W' |5 X5 z4 m
这种方式需要把数据库的用户名和口令放在程序的源代码中。而在WebSphere应用服务器中我们可以在定义数据源的时候通过J2C认证的方式配置数据库访问别名,从而提升安全性。另外,这种方法也更灵活,如果数据库用户名或口令发生变化不需要更改应用程序代码 |