您的位置:首页 > 运维架构 > Tomcat

建立基于 JDBC 的 Tomcat 连接池

2006-08-03 17:20 531 查看
使用传统的方式开发 JDBC 应用时,要为每一次请求建立一次数据库连接,因此在一个这样 Web 应用中,建立数据库连接的操作是系统中代价最大的操作之一。而且,你必须去管理每一个连接,确保他们能被正确关闭,如果出现程序异常而导致某些连接未能关闭,将导致数据库系统中的内存泄露,最终将不得不重启数据库。针对以上问题,首先想到可以采用一个全局的 Connection 对象,创建后就不关闭,以后程序一直使用它,这样就不存在每次创建、关闭的问题了。但是,同一个连接使用次数过多,将会导致连接的不稳定,进而会导致 Web 服务器的频频重启。故而,这种方法也不可取。而连接池技术可以解决上述问题。连接池最基本的思想就是预先建立一些连接放置于内存对象中以备使用,当程序需要建立数据库连接时,只须从内存中取出一个来使用,使用完毕后,只需放回内存即可。而连接的创建和关闭都由连接池来管理。同时,还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等。通过使用连接池,将大大提高程序效率。

做为 Sun 公司推荐的 JSP、Servlet 容器,Tomcat 在 4.0 以上版本支持连接池机制,本文的讨论基于 Tomcat 4.1.24 以及 Oracle 8i 数据库环境。

准备

假设你的 Tomcat 和 Oracle 已经分别跑起来,下面首先为 Tomcat 增加 Oracle 的 JDBC 驱动,Oracle 8.1.7 自带的 JDBC 驱动是 classes12.zip 和 nls_charset12.zip,为了使它们能够被 Tomcat 自动加载,要把他们变为 JAR 格式。实际上 JAR 文件就是包含了 META-INF/MANIFEST.MF 的 zip 文件。

unzip classes12.zip
jar cf classes12.jar javax oracle
rm -rf javax oracle
unzip nls_charset12.zip
jar cf nls_charset12.jar oracle
rm -rf oracle
cp classes12.jar nls_charset12.jar $CATALINA_HOME/common/lib

其中 jar 随 JDK 提供。

配置

假设应用所在的目录别名为 test,Oracle 运行在本地,SID 为 orcl,一个可用的用户名为 dev,口令为 dev123,那么把 Tomcat 的配置文件 server.xml 中的相应上下文修改为:

<Context path="/test" docBase="/var/www/test" debug="0" reloadable="true">
<Resource name="jdbc/testpool" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/testpool">
<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:@localhost:1521:orcl</value>
</parameter>
<parameter>
<name>username</name>
<value>dev</value>
</parameter>
<parameter>
<name>password</name>
<value>dev123</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>

在应用的 web.xml 文件中添加如下 DataSource 声名:

<resource-ref>
<res-ref-name>jdbc/testpool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

重新启动 Tomcat:

/etc/init.d/catalina stop
/etc/init.d/catalina start


执行一个 SQL 语句的演示

以下是这个测试 JSP 文件的核心内容:

<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,

javax.naming.*"%>
<%
try {
Context initCtx = new InitialContext();
Context ctx = (Context) initCtx.lookup("java:comp/env");
Object obj = (Object) ctx.lookup("jdbc/testpool");
javax.sql.DataSource ds = (javax.sql.DataSource)obj;
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,
java.sql.ResultSet.CONCUR_READ_ONLY);
String strSQL = "SELECT * FROM emp";
ResultSet rs = stmt.executeQuery(strSQL);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
...
</html>
<%
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
%>


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息