Tomcat与数据库连接池

本文介绍了数据库连接池的概念,强调频繁创建和关闭连接导致的性能问题。JDBC 2.0引入了数据库连接池技术,以DBCP为例详细讲解如何在Tomcat中配置和使用连接池,包括在不同级别的context.xml中配置Resource标签,以及在web.xml中声明对JNDI资源的引用。最后,展示了JSP中通过JNDI访问数据库连接的代码示例。

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

一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接,频繁地打开,关闭连接将造成系统的性能低下。解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将这写连接组成一个连接池,每次应用程序请求数据库连接时,无需重新建立连接,而是连接池去除已有的连接使用,使用完后不再关闭连接,而是将连接归还给连接池。

JDBC 2.0引入数据库连接池技术。数据库连接池是Connection对象的工厂。使用javax.sql.DataSource来表示,Source只是一个接口,通常用商用服务器提供实现,也有一些开源组织(DBCP和C3P0等)

下面以DBCP为例,解释如何使用数据库连接池的

因为Tomcat和 dbcp 都是Apache公司项目,所以Tomcat内部连接池就是dbcp。

若想使用Tomcat内置连接池,必须要在Context元素中添加Resource标签(用来定义数据源),具体代码如下:(连接的是MySQL数据库)

<Context>
<Resource name="jdbc/mysql"  //JNDI
      auth="Container" 
      type="javax.sql.DataSource" 
      maxActive="50"
      maxIdle="10"
      maxWait="5000" 
      username="root"
      password="19960722w" 
      driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/market?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/>
</Context>
  • driverClassName - JDBC 所用到的数据库驱动的类全名.
  • maxActive - 连接池在活动状态内所提供的最大活动连接数。
  • maxIdle - 连接池在空闲时刻保持的最大连接数.
  • maxWait - 当发生异常时数据库等待的最大毫秒数 (当没有可用的连接时).
  • password - 连接数据库的密码.
  • url - 连接至驱动的URL.
  • username - 数据库用户名
  • name 指定Resource的JNDI名字
  • auth 指定管理Resource的Manager,有两个可选值:Container和Application。Container表示由容器创建和管理Resource,Application表示由Web应用来创建和管理Resource
  • type 指定Resource所属的Java类名

   配置这个元素,一共有三个位置可以选择:
     1.tomcat安装目录/conf/context.xml --------- 对当前Tomcat内部所有虚拟主机中任何工程都有效
     2.tomcat安装目录/conf/Catalina/虚拟主机目录/context.xml -------- 对当前虚拟主机任何工程都有效
     3.在web工程根目录/META-INF/context.xml ------- 对当前工程有效 (常用!)
        具体做法:MyEclipse中,在项目根目录的WebRoot/META-INF中,新建context.xml文件,配置元素。

配置元素完后,使用JNDI访问Tomcat内置的数据库池

(JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,主要作用在于:它可以把Java对象放在一个容器中(支持JNDI容器 Tomcat),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。)

1.将数据库的驱动jar包复制粘贴到Tomcat的lib包下(或当前工程下的WEB-INF/lib目录下)

2.在当前工程的web.xml也要进行配置(声明对这个JNDI资源的引用),添加如下的代码:

 <resource-ref> 
       <description>DB Connection</description> 
       <res-ref-name>jdbc/mysql</res-ref-name> //name也要与context.xml的Resource的name相同
       <res-type>javax.sql.DataSource</res-type> 
       <res-auth>Container</res-auth> 
    </resource-ref>

  •  description:对所用资源的说明
  • res-ref-name:指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应
  • res-type:指定所引用资源的类名字,与<Resource>元素中的type属性对应
  • res-auth:制定管理所引用资源的Manager,与<Resource>元素中的auth属性对应

2.编写访问JNDI程序,运行在Tomcat内部,所以通常是运行在Servlet、JSP中。

JSP测试代码如下:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%> 
<%@ page import="javax.sql.*"%> 
<%@ page import="javax.naming.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
      <title>mysql连接池测试</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0"> 
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
   </head>
  
<body> 
   <%  
       out.print("我的测试开始<br>"); 
       DataSource ds = null; 
       Connection conn=null;
     try{  
              InitialContext ctx=new InitialContext(); 
              ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql"); //Context接口里的方法:lookup(String name) 返回指定的名字绑定的对象
              conn = ds.getConnection();  
    }catch(Exception ex){
     ex.printStackTrace();
    } 
        %>  
    <%   
    if(conn!=null){ 
    %> 
     <%= conn %>;  
   <% 
    } 
   %> 
   </body>
</html>>

注意:

   对于DataSource接口的多数实现类,它的getConnection()方法返回的是Connection代理对象,它也实现java.sql.Connection接口。Connection代理对象的close()方法并不断开数据库的连接,而是把代理的代表数据库连接的Connection对象放回数据库连接池,使它处于空闲状态


这样就可以建立数据库连接池,由Tomcat管理。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值