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 的方式,大多数属性都是相同的,并且具有相同的含义。

相关推荐
激流丶16 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue19 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式36 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画42 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
神里大人2 小时前
idea、pycharm等软件的文件名红色怎么变绿色
java·pycharm·intellij-idea
小冉在学习2 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论