Tomcat JDBC连接池(Tomcat 9)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat JDBC连接池(Tomcat 9)相关的知识,希望对你有一定的参考价值。

参考技术A 连接检查检查连接的有效性,清理失效的连接

注意:

testOnBorrow 并不适合高负载的系统,将会导致每次获取连接都增加一次查询请求,带来额外负载。
高负载系统可以考虑使用 testWhileIdle ,在空闲时检测连接;
testOnReturn 一般用处不大。

当启动evictor线程后,如果连接数小于 minIdle ,则创建新的连接直到 minIdle 个数,没有启动evictor线程时, minIdle 没有意义;

无论是否开启evictor线程,当业务压力增加时,活跃连接数可能超过 maxIdle ,但不会超过 maxActive ;活跃连接数超过 maxIdle 时,使用完的活跃连接归还时会立即关闭;

在没有开启evictor线程,假设活跃连接个数曾经超过 maxIdle 接近或达到 maxActive ,当压力变小,使用中的连接数降低时,假设最终所有连接都空闲下来时,这时空闲连接将维持在 maxIdle 因为此时没有evictor线程。

开启evictor线程后,上述的场景,evictor线程每隔 timeBetweenEvictionRunsMillis 检测空闲,如果连接空闲超过 minEvictableIdleTimeMillis ,则清理空闲连接,最终使空闲连接维持在 minIdle 。

可见当 maxActive 大于 maxIdle 时,活跃连接超过 maxIdle 后归还就会被关闭,再获取时如果没有可用连接,总连接数又小于 maxActive 时,又会新建连接,因此这种情况会带来连接池伸缩造成的性能开销,因此推荐配置 maxActive 等于 maxIdle 避免连接池伸缩开销。

initialSize 是在连接池创建时的初始连接个数,如果启动evictor且 initialSize 小于 minIdle ,则evictor会创建空闲连接将连接数维持在 minIdle ;如果没有开启evictor,则只有连接使用请求上升时,才会在 initialSize 基础上创建新的连接。

Abandoned连接指应用长时间未归还给连接池的连接,连接池可以自动关闭这些连接,以防止连接泄漏。相关配置项如下,具体释义见上表。

注意对于长时间使用同一连接进行批量操作的场景可能不适用该功能。

removeAbandonedTimeout 必须长于应用可能的最长SQL执行时间,否则SQL尚未完成执行,连接就被关闭,因此长时间使用同一连接进行批量操作的场景应谨慎使用该功能。

基于Spring Boot 2.x,直接将tomcat-jdbc加入依赖:

在应用中使用配置类创建 DataSource 类型的Bean:

Tomcat中也带有Tomcat JDBC的jar,但是默认TOMCAT JNDI使用DBCP连接池,如果使用Tomcat JDBC作为Tomcat JNDI的连接池实现,那么就必须在配置中显式指定 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 。

在Tomcat安装目录下的 conf/ 目录中增加 context.xml 文件:

在配置类中通过JNDI查询获取相应的 DataSource 实例:

连接Oracle 12c:

连接mysql 8

以上是关于Tomcat JDBC连接池(Tomcat 9)的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 7 和 Oracle 连接池

Tomcat 在数据库重新启动时未重新连接 PostgreSQL JDBC 池

Spring boot (11) tomcat jdbc连接池

如何记录 Tomcat 7 JDBC 连接池、连接创建

为啥使用 tomcat 进行数据库连接池有两种选择(tomcat-dbcp 和 tomcat-jdbc)?

测试 Tomcat 的 JDBC 池连接