调研背景:
数据库连贯建设是比拟低廉的操作(至多对于 OLTP),不仅要建设 TCP 连贯外还须要进行连贯鉴权操作,所以客户端通常会把数据库连贯保留到连接池中进行复用。连接池保护到弹性数据库(JED)的长连贯,弹性数据库默认不会被动敞开客户端连贯(除非报错),但个别客户端到弹性数据库之间还会有负载平衡代理,它们通常为了节约连贯资源会在连贯闲暇 10 分钟后被动清理连贯,开释无用的连贯资源。这就导致一些用户的连接池探活参数配置不当,进而拿到是曾经生效的连贯。客户端就会报以下谬误:
基于以上的背景咱们依据 Java 利用罕用的连接池的罕用版本的连接池探活相干的性能进行了调研,并对每个版本提供了 JED 配置的模版。目前,罕用的连接池版本如下:
HikariCP 3.2.0、3.4.5、4.0.3
DRUID 1.1.10、1.1.9、1.0.9
DBCP 1.4、2.2.0、2.1.1
HikariCP
咱们第一个章节先来介绍一下 HikariCP 连接池探活相干的内容:
HikariCP 连接池会在须要调配连贯对象给应用程序应用时,先查看连贯对象的状态。为了检测连贯是否可用,连接池会调用 isConnectionAlive
办法。如果连贯对象是可用的,连接池会将连贯对象调配给应用程序应用;如果连贯对象不可用,连接池会创立一个新的连贯对象,并将新的连贯对象调配给应用程序应用。
所以 HikariCP 连接池的连贯对象生效时,连接池只会在日志中输入正告信息,倡议缩短连贯对象的最大生存工夫(\`maxLifetime\`)。然而,这并不会影响程序的失常执行,因为连接池会主动从新创立新的连贯对象并调配给应用程序应用。因而,应用程序能够持续应用连接池中的连贯对象,而不会受到生效连贯的影响。
尽管应用 HikariCP 连接池时,如果不配置连贯探活,应用程序在拿到生效的连贯时不会报错,然而当应用程序须要执行 SQL 时,可能会遇到生效的连贯,导致须要从新建设连贯,减少了额定的性能开销。这样就没有充分发挥连接池的劣势,因为连接池的次要目标是通过重复使用连贯对象来进步应用程序的性能和可伸缩性。
为了最大化施展连接池的价值,咱们就一块来理解一下对于 HikariCP 探活相干的内容,看看如何利用相干的探活参数更高效地应用连接池。
以下是跟 HikariCP 探活通用的相干的参数:
参数名称 | 阐明 | 默认值 |
---|---|---|
minimumIdle | 连接池保护的最小闲暇连接数 | 5 |
maximumPoolSize | 连接池中能包容的最大连接数 | 10 |
maxLifetime | 此参数用来管制连贯在连接池中最大的生命周期,当建设的连接时间超过这个参数时候在闲暇状态就会被销毁。 | 1800000 (30 minutes) |
idleTimeout | 此参数用来管制连贯在连接池中闲暇的工夫,如果设置 8 分钟,就会每隔 8 分钟清理一下超过 minimumIdle 的闲暇连贯。 | 600000 (10 minutes) |
connectionTestQuery | 这个参数在低版本中只会在从池中提供连贯之前执行配置的 SQL。这个参数实用于不反对 JDBC4 Connection.isValid() API,反对 JDBC4 以上驱动的倡议不要配置。 | none |
keepaliveTime | 该属性是避免底层网络基础设施超时断开,定期验证连贯的有效性,如果连贯生效从连接池中剔除。该值必须小于 maxLifetime 值。4. 0.1 以上版本引入的新参数能够联合 connectionTestQuery 参数来探活。 | 0 (禁用) |
HikariCP 连接池的探活代码如下。能够看到,在探活时,连接池会依据 isUseJdbc4Validation 属性的值来决定是否走 JDBC API 进行探活 isUseJdbc4Validation 属性的值是在初始化数据源时依据 connectionTestQuery 属性是否为空来赋值的。如果 connectionTestQuery 属性为空,isUseJdbc4Validation 属性的值为 true,连接池会走 JDBC API 进行探活。因而,在 JDBC 4.0 及以上版本中,不倡议配置 connectionTestQuery 属性进行探活,因为这样会影响探活的效率。
在 HikariCP 较低的版本中,无奈对连贯进行保活,只能在每次获取连贯时验证连贯的有效性。而在 4.0.1 版本中,引入了 keepaliveTime 参数,能够定时的对连贯进行探活。因而,为防止获取到已敞开的连贯,在低版本中,只能将 maxLifetime 参数调整到少于 10 分钟,能力完全避免拿到网关曾经敞开的连贯。在 4.0.1 及以上版本中,能够应用 keepaliveTime 参数配合 connectionTestQuery 参数进行连贯探活,从而在获取连贯之前就进行探活。这样能够进步连贯的可靠性和稳定性,防止应用程序遇到有效连贯的状况。
配置 keepaliveTime 后咱们能够看到每次到配置的工夫就会打印进去探活日志
因而针对线上应用 HikariCP 的利用举荐应用 4.0.1 以上反对 keepaliveTime 的版本。
JED 配置模版:
HikariCP3.2.0
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=10
spring.datasource.hikari.maxLifetime=540000
spring.datasource.hikari.idleTimeout=480000
#JDBC4 以上的版本不倡议配置 connectionTestQuery
spring.datasource.hikari.connectionTestQuery=select 1
低版本中次要保障 maxLifetime 低于 10 分钟可能完全避免拿到网关曾经敞开的连贯,但可能会造成频繁的创立销毁连贯所以倡议应用 4.0.1 以上反对 keepaliveTime 的版本。
HikariCP3.4.5
同 3.2.0 版本。
HikariCP4.0.3
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=10
spring.datasource.hikari.maxLifetime=1800000
spring.datasource.hikari.idleTimeout=600000
#JDBC4 以上的版本不倡议配置 connectionTestQuery
spring.datasource.hikari.connectionTestQuery=select 1
spring.datasource.hikari.keepaliveTime=300000
4.0.1 以上的版本中能够把 keepaliveTime 参数设置小于 10 分钟对连贯进行探活,就能防止拿到被网关敞开的连贯,maxLifetime 的工夫就能够缩短能防止频繁的创立销毁连贯。
参考文档:https://github.com/brettwooldridge/HikariCP#readme
作者:京东批发 王雷鑫
起源:京东云开发者社区 转载请注明起源