千家信息网

Java数据库连接池Tomcat怎么使用

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要介绍"Java数据库连接池Tomcat怎么使用",在日常操作中,相信很多人在Java数据库连接池Tomcat怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年11月08日Java数据库连接池Tomcat怎么使用

这篇文章主要介绍"Java数据库连接池Tomcat怎么使用",在日常操作中,相信很多人在Java数据库连接池Tomcat怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java数据库连接池Tomcat怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言:

Tomcat 连接池是从 Tomcat 7 开始重新编写的高并发连接池,用以取代以前 Tomcat 中使用的 DBCP 1 连接池,它可以配置在 Tomcat 中使用,也可以单独使用。本文主要介绍 Tomcat 连接池的基本使用,文中使用到的软件版本:Java 1.8.0_191、Tomcat 8.5.72、Spring Boot 2.3.12.RELEASE。

1、配置参数

1.1、基础配置

参数默认值描述
factory必须,需要是 org.apache.tomcat.jdbc.pool.DataSourceFactory
type应该是 javax.sql.DataSource 或 javax.sql.XADataSource

1.2、系统属性

参数默认值描述
org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoaderfalse是否只使用当前的类加载器(加载该连接池的类加载器)来加载动态类

1.3、一般参数

这些参数和 DBCP 一致,但有些默认值不一样。

参数默认值描述
defaultAutoCommit驱动的默认值是否自动提交
defaultReadOnly驱动的默认值是否只读
defaultTransactionIsolation驱动的默认值

默认的事务隔离级别
NONE、READ_COMMITTED、READ_UNCOMMITTED、
REPEATABLE_READ、SERIALIZABLE

defaultCatalog

默认的 catalog。(目录,类似于模式名,但比模式名更加抽象;
Oracle,MySQL 不支持,MS SQL Server = 数据库名)

driverClassName驱动名称
url连接 url
username用户名
password密码
maxActive100最大活动连接数
maxIdle100最大空闲连接数
minIdle10最小空闲连接数
initialSize10初始连接数
maxWait3000从连接池获取连接,最大等待时间(秒)
testOnBorrowfalse从连接池获取连接时,是否验证有效性;如果验证失败,则丢弃该连接。
testOnConnecttrue连接创建时,是否验证有效性
testOnReturnfalse连接返回连接池时,是否验证有效性
testWhileIdlefalse连接空闲时,是否验证有效性
validationQuerynull

连接校验的查询sql
如果指定,该 SQL 不需要返回结果,只要不抛 SQLException;如果没有指定,则通过调用 isValid() 方法进行校验。

validationQueryTimeout-1校验查询的超时时间(秒);非正数表示不启用该特性。
validatorClassNamenull校验的类名,需实现 org.apache.tomcat.jdbc.pool.Validator 接口并包含一个无参构造函数。
timeBetweenEvictionRunsMillis5000校验空闲连接的时间周期(毫秒),不能设为小于 1 秒,非正表示不验证
minEvictableIdleTimeMillis60000空闲连接至少多长时间(毫秒)后,才会被校验
removeAbandonedfalse是否删除泄露的连接
removeAbandonedTimeout60连接泄露的超时时间(秒)
logAbandonedfalse连接删除时是否打印堆栈信息
connectionPropertiesnull

连接属性,格式为: [propertyName=property;]*
"user" and "password" 将被除外,所以在此不需要包含这两个属性。

1.4、增强参数

参数默认值描述
initSQLnull连接创建时,执行的初始化 SQL
jdbcInterceptorsnull

jdbc 拦截器,需要继承 org.apache.tomcat.jdbc.pool.JdbcInterceptor;已存在的拦截器:
org.apache.tomcat.jdbc.pool.interceptor.ConnectionState 自动提交、只读、目录和事务隔离级别的跟踪
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer statement的跟踪,在连接返回连接池时关闭它们

validationInterval3000连接校验的最短间隔(毫秒)
jmxEnabledtrue是否注册连接池到 JMX
fairQueuetrue是否使用公平队列,如果为 true,获取连接时将按照 "先进先出" 的原则
abandonWhenPercentageFull0泄露连接达到 abandonWhenPercentageFull 比例才关闭这些连接,0 表示有泄露连接立马关闭
maxAge0连接最大存活时间;在从连接池获取连接和连接返回连接池时进行该项检测,如果 now - time-when-connected > maxAge,则关闭该连接;0 表示不进行该项检测。
useEqualstrue是否使用 String.equals 来判断 ProxyConnection 是否相等
suspectTimeout0和 removeAbandonedTimeout 类似,但该设置只是打印日志并不删除连接;大于 0 才生效。
rollbackOnReturnfalse连接在返回连接池时是否自动回滚事务。
commitOnReturnfalse连接在返回连接池时是否自动提交事务;如果 rollbackOnReturn==true 则忽略该参数。
alternateUsernameAllowedfalse从连接池获取连接时是否允许设置新的凭证。默认情况下,连接池会忽略 DataSource.getConnection(username,password) 的调用,直接返回一个已创建的连接;如果要使用不同的凭证来获取连接,即 DataSource.getConnection(username,password) 生效,可把该参数设为 true。
dataSourcenull设置数据源,连接池将从该数据源获取连接
dataSourceJNDInull数据源的 jndi
useDisposableConnectionFacadetrue是否使用连接外观;设置为 true 可以防止连接关闭后的重复使用。
logValidationErrorsfalse是否记录校验的错误
propagateInterruptStatefalse是否传播线程中断状态
ignoreExceptionOnPreLoadfalse是否忽略创建连接时的错误
useStatementFacadetrue如果希望使用包装 statement,以便在设置了 statement 代理时,在已关闭的 statement 上调用 equals() and hashCode() 方法,需将此设置为 true。

详细的说明可以参考官网文档:https://tomcat.apache.org/tomcat-8.5-doc/jdbc-pool.html

2、使用

2.1、直接使用

2.1.1、引入依赖
    org.apache.tomcat    tomcat-jdbc    8.5.72
2.1.2、使用例子
package com.abc.demo.general.dbpool;import org.apache.tomcat.jdbc.pool.DataSource;import org.apache.tomcat.jdbc.pool.PoolProperties;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class TomcatPoolCase {    public static void main(String[] args) {        PoolProperties poolProperties = new PoolProperties();        poolProperties.setName("Tomcat连接池");        poolProperties.setUrl("jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8");        poolProperties.setDriverClassName("com.mysql.cj.jdbc.Driver");        poolProperties.setUsername("root");        poolProperties.setPassword("123456");        poolProperties.setJmxEnabled(true);        poolProperties.setTestWhileIdle(false);        poolProperties.setTestOnBorrow(true);        poolProperties.setValidationQuery("SELECT 1");        poolProperties.setTestOnReturn(false);        poolProperties.setValidationInterval(30000);        poolProperties.setTimeBetweenEvictionRunsMillis(30000);        poolProperties.setMaxActive(100);        poolProperties.setInitialSize(10);        poolProperties.setMaxWait(10000);        poolProperties.setRemoveAbandonedTimeout(60);        poolProperties.setMinEvictableIdleTimeMillis(30000);        poolProperties.setMinIdle(10);        poolProperties.setLogAbandoned(true);        poolProperties.setRemoveAbandoned(true);        poolProperties.setJdbcInterceptors(                "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" +                "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");        DataSource datasource = new DataSource();        datasource.setPoolProperties(poolProperties);        Connection connection = null;        try {            connection = datasource.getConnection();            Statement st = connection.createStatement();            ResultSet rs = st.executeQuery("select version()");            if (rs.next()) {                System.out.println(rs.getString(1));            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            close(connection);        }        //实际使用中一般是在应用启动时初始化数据源,应用从数据源中获取连接;并不会关闭数据源。        datasource.close();    }    private static void close(Connection connection) {        if (connection != null) {            try {                connection.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

2.2、作为资源配置在 Tomcat 中

先把对应数据库的驱动包拷贝到 Tomcat 或应用的 lib 目录下,然后在 content.xml 中配置资源,

content.xml 可以在如下位置:

  • conf/context.xml:针对所有的应用

  • conf/Catalina/localhost:针对单个应用,适合在 Tomcat 外部部署应用

  • {应用}/META-INFcontext.xml:针对单个应用

配置资源的例子如下:

可以通过 jndi 来查找该资源,这里通过 jsp 来演示查找方法:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%><%@ page import="javax.naming.Context,                javax.naming.InitialContext,                javax.sql.DataSource,                java.sql.*"%><%    Connection connection = null;    try {        InitialContext initialContext = new InitialContext();        Context context = (Context) initialContext.lookup("java:comp/env");        DataSource dataSource = (DataSource)context.lookup("jdbc/testDb");        connection = dataSource.getConnection();        Statement st = connection.createStatement();        ResultSet rs = st.executeQuery("select version()");        if (rs.next()) {            System.out.println(rs.getString(1));        }    } catch (Exception e) {        e.printStackTrace();    } finally {        if (connection != null) {            try {                connection.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }%>            

通过 jndi 查找数据源并获取数据库的版本信息

3.2、在 SpringBoot 中使用

3.1.1、引入依赖
    org.springframework.boot    spring-boot-starter-parent    2.3.12.RELEASE                org.springframework.boot        spring-boot-starter-web                org.springframework        spring-jdbc                org.apache.tomcat        tomcat-jdbc        8.5.72                mysql        mysql-connector-java    
3.1.2、单数据源

application.yml 配置:

spring:  datasource:    tomcat-pool:      name: Tomcat连接池      url: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8      driver-class-name: com.mysql.cj.jdbc.Driver      username: root      password: 123456      test-while-idle: true      test-on-borrow: true      validation-query: select 1      test-on-return: false      validation-interval: 30000      time-between-eviction-runs-millis: 30000      max-active: 100      initial-size: 10      max-wait: 10000      remove-abandoned-timeout: 60      min-evictable-idle-time-millis: 30000      min-idle: 10      log-abandoned: true      remove-abandoned: true      jdbc-interceptors: org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer

数据源配置类:

package com.abc.demo.config;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configurationpublic class DataSourceConfig {    @Bean("dataSource")    @ConfigurationProperties(prefix = "spring.datasource.tomcat-pool")    public DataSource dataSource() {        return DataSourceBuilder.create().type(org.apache.tomcat.jdbc.pool.DataSource.class).build();    }}

使用:

@Autowiredprivate DataSource dataSource;
3.1.3、多数据源

application.yml 配置:

spring:  datasource:    tomcat-pool:      db1:        name: Tomcat连接池        url: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8        driver-class-name: com.mysql.cj.jdbc.Driver        username: root        password: 123456        test-while-idle: true        test-on-borrow: true        validation-query: select 1        test-on-return: false        validation-interval: 30000        time-between-eviction-runs-millis: 30000        max-active: 100        initial-size: 10        max-wait: 10000        remove-abandoned-timeout: 60        min-evictable-idle-time-millis: 30000        min-idle: 10        log-abandoned: true        remove-abandoned: true        jdbc-interceptors: org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer      db2:        name: Tomcat连接池        url: jdbc:mysql://10.110.74.187:3306/egmp?useUnicode=true&characterEncoding=UTF-8        driver-class-name: com.mysql.cj.jdbc.Driver        username: root        password: InsYR0ot187!        test-while-idle: true        test-on-borrow: true        validation-query: select 1        test-on-return: false        validation-interval: 30000        time-between-eviction-runs-millis: 30000        max-active: 100        initial-size: 10        max-wait: 10000        remove-abandoned-timeout: 60        min-evictable-idle-time-millis: 30000        min-idle: 10        log-abandoned: true        remove-abandoned: true        jdbc-interceptors: org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer

数据源配置类:

package com.abc.demo.config;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configurationpublic class DataSourceConfig {    @Bean("dataSource1")    @ConfigurationProperties(prefix = "spring.datasource.tomcat-pool.db1")    public DataSource dataSource1() {        return DataSourceBuilder.create().type(org.apache.tomcat.jdbc.pool.DataSource.class).build();    }    @Bean("dataSource2")    @ConfigurationProperties(prefix = "spring.datasource.tomcat-pool.db2")    public DataSource dataSource2() {        return DataSourceBuilder.create().type(org.apache.tomcat.jdbc.pool.DataSource.class).build();    }}

使用:

@Autowired@Qualifier("dataSource1")private DataSource dataSource1;@Autowired@Qualifier("dataSource2")private DataSource dataSource2;

到此,关于"Java数据库连接池Tomcat怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 数据源 参数 配置 应用 数据库 时间 验证 空闲 驱动 最大 有效 事务 方法 有效性 资源 学习 属性 目录 例子 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 word怎么添加数据库域 中国怎样增加根服务器 华勤应用软件开发测试题 综合 监管 数据库 医院网络安全演练小结 企业微信内部应用数据库 黑色沙漠未检测到可用服务器 嘉峪关数字雄关网络技术有限公司 验证数据库中是否存在 吓人视频软件开发 多服务器session管理 戴尔服务器风扇声音大 信息技术部关于网络安全 无锡金鑫互联网科技有限公司 福州点对点聊天软件开发 电脑许可管理服务器 全国可信网站数据库查询 以太网模块与数据库连接 网络安全相关宣全 呼和浩特网络安全工资待遇好吗 数据库中表的删除sql语句 网络安全事件的距离 2021年网络安全人才报告 合肥服务器回收公司诚信企业推荐 sql数据库只备份空库 桌面开发需要哪些软件和数据库 服务器和网站空间的关系 数据库工程师的主要业绩 数据中心服务器安全 数据库技术怎么操作
0