在Tomcat 10.1中,当你通过JNDI配置数据库连接池时,实际上可以选择使用Tomcat自带的JDBC连接池(基于Apache Tomcat JDBC Connection Pool)或者其他连接池如Apache Commons DBCP。如果没有特别指定,Tomcat倾向于使用自己的JDBC连接池。
在前两篇文章中讨论了使用JNDI配置Tomcat的JDBC连接池。
本文讨论使用JNDI来配置DBCP数据源。
一、DBCP数据源概述
DBCP(Database Connection Pool,数据库连接池)是Apache Commons项目提供的一个开源数据库连接池实现。它旨在通过重用数据库连接来减少每次连接和断开数据库所需的时间和资源开销,从而提高数据库操作的性能和效率。DBCP是Java应用中广泛使用的连接池技术之一,尤其适用于Web应用和企业级应用。
配置DBCP数据源涉及设置一系列属性,这些属性控制着连接池的行为。这些配置可以直接硬编码在Java代码中(通过数据源对象的setXXX()方法设置属性),通过配置文件加载(如properties文件);或者在依赖注入框架(如Spring)中配置。数据源常见的配置属性,如表1所示。
表 1 DBCP数据源常见属性
| 属性 | 说明 |
| driverClassName | 数据库驱动类名。 |
| url | 数据库URL。 |
| username | 数据库用户名。 |
| password | 数据库密码。 |
| initialSize | 连接池启动时创建的初始化连接数。默认0。 |
| maxTotal | 连接池中允许的最大连接数。默认8。 |
| maxIdle | 连接池中允许的最大空闲连接数。默认8。 |
| minIdle | 连接池中允许的最小空闲连接数。默认0。 |
| maxWaitMillis | 等待连接变为可用的最大时间,单位毫秒,超过该时间则抛出异常。默认-1,表示无限等待。 |
下面直接用一个例子说明。
二、JNDI配置DBCP数据源示例
测试环境:eclipse2023,java17,tomcat10.1,mySql8.0,dbcp2。
实现步骤
1、创建数据库
创建mySql8.0数据库studentdb,并创建学生表t_student,表中添加5条记录。

2、创建项目,并导入需要的包
项目名proJndi,添加数据库连接包到项目中。目录结构如图1。

图1 项目目录结构
项目中添加DBCP数据源JAR包。如下图

3.配置JNDI数据源
在项目的META_INF文件夹中创建context.xml文件。在文件中添加资源定义。
<context>
<Resource name="jdbc/StudentDB" auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/studentdb?useSSL=false&serverTimezone=UTC"
username="root" password="123456" maxTotal="20" maxIdle="10"
maxWaitMillis="-1"/>
</context>
<Resouce>标签中增加factory属性。factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" 指定了BasicDataSourceFactory类作为工厂类,这个类是Apache Commons DBCP 2.x版本提供的,用于创建和配置DBCP连接池。
4.在Web应用的web.xml中声明资源引用
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/StudentDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
5.查询 JNDI数据源,获取数据库连接对象
在com.qrh.utils包中创建一个Java类JndiUtils,用于通过JNDI查找数据源,并获取Connection连接对象。这里的数据源使用DBCP的数据源 org.apache.tomcat.dbcp.dbcp2.BasicDataSource。
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
//import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
public class JndiUtils {
static public Connection getconn() {
Connection conn = null;
Context initContext;
try {
// 获取JNDI上下文
initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
// 查找数据源
BasicDataSource ds = (BasicDataSource) envContext.lookup("jdbc/StudentDB");
// 从数据源获取数据库连接
conn = ds.getConnection();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
6.创建访问数据库的通用操作类
创建com.qrh.utils.BaseDao类,在该类中对表t_student查询操作及关闭连接的方法。
7.创建Servlet类,访问数据库
创建com.qrh.servlet.ShowStudentServlet类,查询学生数据存储到Studnet类的集合中,请求转发到student.jsp页面。代码如下。
8.创建student.jsp文件,显示学生信息
9.运行
启动项目运行结果如下图2

学生信息查询
图2 项目运行结果
说明,这个案例相对 于“JNDI数据源案例分析”中的步骤有一些修改,说明如下:
1.第2步中,需要导入dbcp2数据源JAR包。
2.第3步的配置中,<Resouce>标签中增加factory属性。
3.第5步中创建的数据源实例为DBCP数据源实例对象。
其它步骤没有变化。
上述个人观点,仅供参考。
本文详细介绍了如何在Tomcat 10.1中使用JNDI配置Apache Commons DBCP数据源,包括创建数据库、项目配置、JNDI数据源配置、web.xml中声明资源引用、查询数据源、创建数据库操作类和Servlet,最后展示运行结果。
5688

被折叠的 条评论
为什么被折叠?



