建立基于 JDBC 的 Tomcat 连接池

本文介绍如何在Tomcat中配置Oracle数据库连接池,包括安装JDBC驱动、设置连接池参数及使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用传统的方式开发 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;
}
%>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值