使用Tomcat数据库连接池的时候,在网上查了不少例子,这是本人做的一个Oracle的例子。
以 Oracle 的 JDBC 驱动设置为例:
Oracle8i 的驱动在 /oracle/ora81/jdbc/lib/ 目录下。名字为 classes12.zip 。
Oracle9i 的驱动在 /oracle9i/jdbc/lib/ 目录下,名字为 ojdbc14.jar 。
将这个文件 copy 到 D:/Tomcat 4.1/common/lib 下。
注意,如果使用 Oracle8i 的驱动,则需要在 D:/Tomcat 4.1/common/lib 目录下将 classes12.zip 更名为 classes12.jar ,因为 Tomcat4 不认识 zip 的后缀名。
2.设置Tomcat的连接池数据源
在网上看到一种直接利用Tomcat 的web应用管理界面(Tomcat Web Server Administration Tool)设置的方法,我在这使用了手工改动的方式:
打开Tomcat /conf/server.xml(如果是使用Eclipse中的WTP测试,请找到对应的server.xml文件)中,找到<Context>映射对,例:
<Context path="/myapp" docBase="E:/Alex/temp/myapp" debug="0" reloadable="true" crossContext="true">
</Context>
在其中加入:
<Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/myoracle">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@172.21.240.1:1521:itscoenr</value>
</parameter>
<parameter>
<name>username</name>
<value>myname</value>
</parameter>
<parameter>
<name>password</name>
<value>mypassword</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
</ResourceParams>
<ResourceLink global="jdbc/myoracle" name="jdbc/myoracle" type="javax.sql.DataSource"/>
在这添加了一个数据源,名字为jdbc/myoracle。以后是一些参数。
type,”javax.sql.DataSource”;
password,数据库用户密码;
driveClassName,数据库驱动;
maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
MaxActive,连接池的最大数据库连接数。设为0表示无限制。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
最后添加的是一个本web应用对全局连接池的引用说明,设置这个连接池的引用说明是非常重要的一步。
一些朋友在Tomcat4中配置连接池失败的原因大都归咎与此。还有网上一些文章说这是一个Tomcat4的一个Bug。
全部改完之后为:
<Context path="/myapp" docBase="E:/myapp" debug="0" reloadable="true" crossContext="true">
<Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/myoracle">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@172.21.240.1:1521:itscoenr</value>
</parameter>
<parameter>
<name>username</name>
<value>myname</value>
</parameter>
<parameter>
<name>password</name>
<value>mypassword</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
</ResourceParams>
<ResourceLink global="jdbc/myoracle" name="jdbc/myoracle" type="javax.sql.DataSource"/>
</Context>
3.设置web.xml
到此,连接池的设置就完成了。 然后需要重新启动Tomcat,这样就可以使用连接池来工作了。
但是,看到很多文章上说,还需要设置一下web.xml才能应用。我没有设置web.xml,连接池也可以完全使用。现在说一下web.xml的配置方法。
本例为:
E:/myapp/WEB-INF/下的web.xml,打开,并在<web-app></web-app>中加入内容,加完后为:
<web-app>
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
子节点说明: description,描述信息;
res-ref-name,参考数据源名字,同上一步的属性name;
res-type,资源类型,”javax.sql.DataSource”;
res-auth,”Container”;
res-sharing-scope,”Shareable”;
4..一个简单的JSP应用示例
一个简单的只有查询的JSP,内容如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
DataSource ds = null;
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
//获取连接池对象并进行类型转换
ds = (DataSource)envCtx.lookup("jdbc/myoracle");
if(ds!=null){
out.println("Connection is OK!");
Connection cn=ds.getConnection();
if(cn!=null){
out.println("cn is Ok!");
Statement stmt = cn.createStatement();
ResultSet rst = stmt.executeQuery("select ename from emp");
out.println("<p>rst is Ok!" + rst.next());
while(rst.next()){
out.println("<P>Ename:" + rst.getString(1));
}
stmt.close();
rst.close();
cn.close();
}
else{
out.println("rst Fail!");
}
}
else{
out.println("Fail!");
}
}
catch(Exception ne){
out.println(ne);
}
%>
</body>
</html>