web server apache tomcat11-30-The Tomcat JDBC Connection Pool

前言

整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。

开源项目

从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。

系列文章

web server apache tomcat11-01-官方文档入门介绍

web server apache tomcat11-02-setup 启动

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

web server apache tomcat11-11-Jasper 2 JSP Engine

web server apache tomcat11-12-SSL/TLS Configuration

web server apache tomcat11-13-SSI

web server apache tomcat11-14-CGI

web server apache tomcat11-15-proxy

web server apache tomcat11-16-mbean

web server apache tomcat11-17-default-servlet

web server apache tomcat11-18-clusting 集群

web server apache tomcat11-19-load balance 负载均衡

web server apache tomcat11-20-connectors 连接器

web server apache tomcat11-21-monitor and management 监控与管理

web server apache tomcat11-22-logging 日志

web server apache tomcat11-23-APR

web server apache tomcat11-24-Virtual Hosting and Tomcat

web server apache tomcat11-25-Advanced IO and Tomcat

web server apache tomcat11-26-maven jars

web server apache tomcat11-27-Security Considerations

web server apache tomcat11-28-Windows Service

web server apache tomcat11-29-Windows Authentication

web server apache tomcat11-30-The Tomcat JDBC Connection Pool

web server apache tomcat11-31-websocket

web server apache tomcat11-32-rewrite

web server apache tomcat11-33-CDI

web server apache tomcat11-34-Ahead of Time compilation support

简介

JDBC连接池org.apache.tomcat.jdbc.pool是Apache Commons DBCP连接池的替代或替代方案。

那么为什么我们需要一个新的连接池呢?

以下是一些原因:

  • Commons DBCP 1.x是单线程的。为了保证线程安全,Commons在对象分配和对象返回期间短暂锁定整个池。请注意,这不适用于Commons DBCP 2.x。
  • Commons DBCP 1.x可能会很慢。随着逻辑CPU数量的增长和尝试借用或返回对象的并发线程数量的增加,性能会下降。对于高度并发的系统,影响可能会很大。请注意,这不适用于Commons DBCP 2.x。
  • Commons DBCP有60多个类。tomcat-jdbc-pool核心是8个类,因此对未来需求进行修改将需要更少的更改。这就是运行连接池本身所需的全部内容,其他都是附加的。
  • Commons DBCP使用静态接口。这意味着您必须使用给定JRE版本的正确版本,否则可能会看到NoSuchMethodException异常。
  • 当一个连接池可以通过一个更简单的实现来完成时,重写60多个类是不值得的。

Tomcat jdbc池实现了异步检索连接的能力,而无需向库本身添加额外的线程。Tomcat jdbc池是Tomcat模块,它依赖于Tomcat JULI,这是Tomcat中使用的简化日志记录框架。

功能增加

  • 支持高度并发的环境和多核/CPU系统。
  • 接口的动态实现,将为您的运行时环境支持java.sql和javax.sql接口(只要您的JDBC驱动程序也支持相同的接口),即使使用较低版本的JDK进行编译也是如此。
  • 验证间隔 - 我们不必在每次使用连接时都进行验证,我们可以在借用或返回连接时进行验证,但不要比我们可以配置的间隔更频繁。
  • 一次性运行查询,在建立与数据库的连接时仅运行一次的可配置查询。在建立连接期间设置会话设置非常有用。
  • 能够配置自定义拦截器。这允许您编写自定义拦截器来增强功能。您可以使用拦截器来收集查询统计信息,缓存会话状态,失败时重新连接连接,重试查询,缓存查询结果等等。您的选择是无限的,拦截器是动态的,不限于java.sql/javax.sql接口的JDK版本。
  • 高性能 - 我们将在稍后展示一些性能差异
  • 极其简单,由于实现非常简化,所以行数和源文件数非常低,与具有超过200个源文件(上次我们检查时)的c3p0相比,Tomcat jdbc有8个文件的核心,连接池本身约为其一半。由于可能会发生错误,因此跟踪错误将更快,更容易修复。从一开始,简化复杂性就是一个重点。
  • 异步连接检索 - 您可以排队请求连接并收到 Future<Connection>
  • 更好的空闲连接处理。它不直接关闭连接,仍然可以对连接进行池化,并且使用更智能的算法调整空闲池的大小。
  • 您可以在什么时候将连接视为被丢弃时进行决定,是在池满时还是在指定的超时时直接进行,通过指定池使用阈值来实现。
  • 放弃连接定时器将在语句/查询活动时重置。允许长时间使用的连接不超时。这是通过ResetAbandonedTimer实现的
  • 连接在连接一段时间后关闭。基于年龄的返回池后关闭。
  • 当怀疑连接被丢弃时,获得JMX通知和日志条目。这类似于removeAbandonedTimeout,但它不采取任何行动,只报告信息。这是通过suspectTimeout属性实现的。
  • 连接可以从java.sql.Driver、javax.sql.DataSource或javax.sql.XADataSource中检索。这是通过dataSource和dataSourceJNDI属性实现的。

如何使用

Tomcat连接池的使用尽可能简单,对于那些熟悉commons-dbcp的人来说,过渡将非常简单。从其他连接池过渡也相当简单。

其他功能

Tomcat连接池提供了一些其他功能,超出了大多数其他池所能做的:

  • initSQL - 在连接创建时运行一次SQL语句的能力

  • validationInterval - 除了在连接上运行验证之外,还避免运行太频繁。

  • jdbcInterceptors - 灵活且可插拔的拦截器,用于在池、查询执行和结果集处理周围创建任何自定义。关于这一点的更多信息请参见高级部分。

  • fairQueue - 将fair标志设置为true以实现线程公平性,或者使用异步连接检索

    在Apache Tomcat容器内部

Tomcat连接池配置为资源,详见Tomcat JDBC文档。唯一的区别是您必须指定factory属性并将值设置为org.apache.tomcat.jdbc.pool.DataSourceFactory

独立运行

连接池仅具有另一个依赖项,即tomcat-juli.jar。要在独立项目中使用bean实例化来配置池,要实例化的bean是org.apache.tomcat.jdbc.pool.DataSource。与配置J

NDI资源的连接池相同的属性(下面有文档)被用于配置数据源作为bean。

JMX

连接池对象公开了一个MBean,可以注册。为了使连接池对象创建MBean,必须将标志jmxEnabled设置为true。这并不意味着池将注册到MBean服务器,仅仅是创建了MBean。

在像Tomcat这样的容器中,Tomcat本身将DataSource注册到MBean服务器,然后org.apache.tomcat.jdbc.pool.DataSource对象将注册实际的连接池MBean。如果在容器外运行,则可以自己将DataSource注册到您指定的任何对象名称下,并将注册传播到底层池。要做到这一点,您将调用mBeanServer.registerMBean(dataSource.getPool().getJmxPool(),objectname)。在调用此方法之前,请确保池已经创建,方法是调用dataSource.createPool()。

属性

为了提供一个非常简单的切换从 commons-dbcp 到 tomcat-jdbc-pool 的方式,大多数属性都是相同的,并且具有相同的含义。

相关推荐
ChinaRainbowSea2 分钟前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
KiddoStone12 分钟前
多实例schedule job同步数据流的数据一致性设计和实现方案
java
岁忧33 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao36 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干2 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github