在Tomcat中使用JNDI来配置DBCP数据源

本文详细介绍了如何在Tomcat 10.1中使用JNDI配置Apache Commons DBCP数据源,包括创建数据库、项目配置、JNDI数据源配置、web.xml中声明资源引用、查询数据源、创建数据库操作类和Servlet,最后展示运行结果。

在Tomcat 10.1中,当你通过JNDI配置数据库连接池时,实际上可以选择使用Tomcat自带的JDBC连接池(基于Apache Tomcat JDBC Connection Pool)或者其他连接池如Apache Commons DBCP。如果没有特别指定,Tomcat倾向于使用自己的JDBC连接池。

通过JNDI数据源获取数据库连接对象

JNDI数据源案例分析

在前两篇文章中讨论了使用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条记录。

0d539baa2b4f50f2c95ca75185eebf43.png

 

2、创建项目,并导入需要的包

项目名proJndi,添加数据库连接包到项目中。目录结构如图1。

bf84bd4f386ae6c43fd3eac526137d26.png

                                     图1  项目目录结构

项目中添加DBCP数据源JAR包。如下图

40728a8af188127abf43ef8e4974afed.png

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&amp;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

4723b265d90a5e66e5e6d432a57c2e23.png

学生信息查询

图2 项目运行结果

说明,这个案例相对 于“JNDI数据源案例分析”中的步骤有一些修改,说明如下:

1.第2步中,需要导入dbcp2数据源JAR包。

2.第3步的配置中,<Resouce>标签中增加factory属性。

3.第5步中创建的数据源实例为DBCP数据源实例对象。

其它步骤没有变化。

上述个人观点,仅供参考。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值