4.1.3 配置数据库连接池

优质
小牛编辑
148浏览
2023-12-01

由于基于HTTP协议的Web程序是无状态的,因此,在应用程序中使用JDBC时,每次处理客户端请求时都会重新建立数据库连接。如果客户端的请求非常频繁,服务端在处理数据库时将会消耗非常多的资源。因此,在Tomcat中提供了数据库连接池技术。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个数据库连接。在使用完一个数据库连接后,将其归还数据库连接池,以备其他程序使用。

在Tomcat中配置数据库连接池有两种方法:

1. 配置全局数据库连接池

(1)打开<Tomcat安装目录>\conf\server.xml文件,并从中找到<GlobalNamingResources>元素,然后加入一个子元素<Resource>,这个子元素的配置代码如下:

<Resource name="jdbc/mydb" auth="Container"

              type="javax.sql.DataSource"

              driverClassName="com.mysql.jdbc.Driver"

              url="jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF8"

              username="root"

              password="1234"             

              maxActive="200"

              maxIdle="50"

              maxWait="3000"/>

上面的配置代码有几个和数据库连接池性能有关的属性需要说明一下:

l maxActive:连接池可以存储的最大连接数,也就是应用程序可以同时获得的最大连接数。这个属性值一般根据Web程序的最大访问量设置。

l maxIdle:最大空闲连接数。当应用程序使用完一个数据库连接后,如果连接池中存储的连接数小于maxIdle,这个数据库连接并不马上释放,而是仍然存储在连接池中,以备其他程序使用。这个属性值一般根据Web程序的平均访问量设置。

l maxWait:暂时无法获得数据库连接的等待时间(单位:毫秒)。如果Web程序从数据库连接池中获得的数据库连接数已经等于maxActive,而且都没有归还给连接池,这时再有程序想获得数据库连接,就会等待maxWait所指定的时间。如果超过maxWait所指定的时间还无法获得数据库连接,就会抛出异常。

(2)在<Tomcat安装目录>\conf\Catalina\localhost中建立一个demo.xml文件(文件名要和path属性值一致),然后输入如下内容:

<Context path="/demo" docBase="demo" debug="0">

    <ResourceLink name="jdbc/mydb" global="jdbc/mydb" type="javax.sql.DataSource"/>

</Context>

2. 配置局部数据库连接池

在<Tomcat安装目录>\conf\Catalina\localhost中建立一个demo.xml文件,然后输入如下内容:

<Context path="/demo" docBase="demo" debug="0">

      <Resource name="jdbc/mydb" auth="Container"

               type="javax.sql.DataSource"

               driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF8"

               username="root"

               password="1234"             

               maxActive="200"

               maxIdle="50"

               maxWait="3000"/>

</Context>

在配置完数据库连接池后,可以在Servlet的service方法或其他处理HTTP请求的方法中使用如下代码来连接数据库:

javax.naming.Context ctx = new javax.naming.InitialContext();

//  获得DataSource对象

javax.sql.DataSource ds = (javax.sql.DataSource)

    ctx.lookup("java:/comp/env/jdbc/mydb"); 

//  获得Connection对象

Connection conn = ds.getConnection(); 

在获得Connection对象后的操作就和不使用数据库连接池操作数据库是一样的了。