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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容