wuqingyong的专栏

技术小站

在Tomcat配置和使用数据库资源(DataSource)
主题:使用数据库资源

由于很多WEB程序需要通过Jdbc访问数据库,J2EE标准规定了J2EE应用程序服务器要提供
支持JDBC和连接池的数据库资源(DataSource).这样WEB程序不必自己实现JDBC连接和
连接池机制。有些能单独运行的WEB服务器(如TOMCAT)也根据J2EE标准支持DataSource方法。
这样,使用DataSource访问数据库的Web程序可以不用改动就在其他J2EE程序服务器上运行,
下面以Tomcat为例说明使用WEB程序DataSource的方法。

在Web程序中要使用DataSource访问数据库,包括以下步骤:

1.安装JDBC驱动器
需要将适当的JDBC驱动器的JAR文件安装到$CATALINA_HOME/common/lib目录下。
WEB服务器的DataSource资源管理机制会用到该JDBC驱动器。

2.设置server.xml中的程序上下文
Tomcat4和Tomcat5支持定义JNDI初始化上下文(InitialContext)。
JNDI(Java Naming and Directory InterFace)技术。它提供了统一Java命名和目录服务。

JNDI初始化上下文当Web程序第一次被部署时由Web容器来创建和管理。一个初始化上下文
可以代表一个Web程序的有关配置信息,初始化上下文可以在$CATALINA_HOME/conf/server.xml
文件中设置。可以作为程序的部署描述文件(WEB-INF/web.xml),用来参考初始化上下文中定义的元素。
DataSource是初始化上下文的一种,它可以被Web程序中的servlet等构件用来进行数据库连接。

Tomcat配置JNDI DataSource需要在$CATALINA_HOME/conf/server.xml的<Host name="localhost"...>和</Host>之间加入下面的上下文<context>定义。

程序例:
<Context path="/icwork" docBase="icwork" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/WorkflowAppDb" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/WorkflowAppDb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>4</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>2</value>
</parameter>
<parameter>
<name>username</name>
<value>PUBLIC</value>
</parameter>
<parameter>
<name>password</name>
<value>public</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:pointbase:server://localhost/workflow</value>
</parameter>
<parameter>
<name>dirverClassName</name>
<value>com.pointbase.jdbc.jdbcUniversalDriver</value>
</parameter>
</ResourceParams>
</context>

其中<Resource name="jdbc/WorkflowAppDb" auth="Container" type="javax.sql.DataSource"/>定义了一个DataSource,后面的<ResourceParams>...</ResourceParams>定义了该数据库资源的有关参数(比如username,password,driverClassName,URL等)。这些参数和前面讲到的JDBC连接参数内容基本一致。
driverClassName:JDBC驱动器的类名。
password:数据库密码
url:数据库URL
username:数据库用户名
validationQuery:用来在实际程序使用连接之前检测数据库是否工作的SQL访问命令(select 命令)。
在<ReaourceParams>中同时定义了Tomcat的数据库资源工厂(data source resource factory)的参数。Tomcat使用的DBCP数据资源工厂实现了Connection Pool 的功能,默认的数据资源工厂类名为org.apache.naming.factory.DbcpDataSourceFactory(编程者也可以自己编写数据资源工厂,具体参考Tomcat的有关说明)。DBCP数据资源工厂有下面的参数:
maxActive:数据库连接池允许的最大正在使用的连接数目
maxIdle:数据库连接池允许的最大闲置连接数目
maxWait:数据库连接池允许等待的最长时间(毫秒),如果客户等待超过这个时间,连接就弹出例外。

3.定义程序数据资源需求
接下来,应该在WEB-INF/web.xml文件中定义程序所查找和使用的数据资源JNDI名称。
一般Tomcat数据资源默认的名称为jdbc/xxx(相对标准的java:comp/env JNDI根目录名称)。
比如本书的范例Web程序icwork使用数据库名为WorkflowAppDb,它在web.xml中要加入下
面的JNDI资源连接部分。

程序示例如下:

<resource-ref>
<description>
DataSource reference to workflowAppDb defined in server.xml
</description>
<res-ref-name>jdbc/WorkflowAppDb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

4.在程序中使用数据资源
在程序中,可以通过JNDI查找获得前面定义的数据资源。主要的操作是
使用javax.naming.Context的lookup方法返回一个DataSource对象。数
据库的JNDI名称为"java:comp/env/"加上<resource-ref>中定义的名称,
然后使用DataSource的getConnection方法返回一个数据库连接。其后的
操作和JDBC连接例子中的SQL方法相同。
程序如下:

import javax.naming.*;
import javax.sql.*;
import java.sql.*;

public class WorkflowDBConnector{
public void init(){
try{
Context ctx=new InitialContext();
if(ctx==null){
throw new Exception("Context Look Up Error");
}
DataSource dsource=(DataSource)ctx.lookup("java:comp/env/jdbc/WorkflowAppDb");
if(dsource!=null){
Connection conn=dsource.getConnection();
if(conn!=null){
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from Concept order by ConceptID");
if(rs.next()){
...
}
conn.close();
}
}
catch(Exception e){
e.printStackTrace();
}
}
}

 
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

在Tomcat配置和使用数据库资源(DataSource)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭