远程桌面登陆 typeAliases overflow shell svg primefaces rspec compilation Seajs vue循环数组 base64转16进制 增删改查sql语句 idea批量替换快捷键 python函数大全 java入门 javascanner java函数 java环境变量配置 shell编程学习 linux内核编程 python 教程 p2pover vs2010sp1 microkms js上传图片 脚本之家官网 自动喊话器 笔记本测试软件 摩尔斯电码翻译器在线 udp测试工具 arm体系结构与编程 proteus8 pr书写效果 js动态添加元素 数据结构与算法分析 txplatform allowtransparency lol不能全屏 a1474 华为工具箱
当前位置: 首页 > 学习教程  > 编程语言

hikari参数配置的问题

2020/7/24 9:52:50 文章标签:

项目启动后,过段时候就挂掉,查询tomcat日志:

HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@21c326f0 (No operations allowed after connection closed.)

意思就是当springboot连接数据库的时候,会建立一个和数据库的连接,这个连接保存在数据库连接池中,现在这个连接已经time out已经不能用了,但是这个连接还是保存在数据库连接池中,springboot仍然使用这个连接去连接数据库,所以才会报错。

那么知道了原因,解决这个问题呢,首先要知道可以设置连接在连接池中的存活时间,什么是连接的存活时间呢,简而言之就是这个连接要保存在连接池中多长时间才被清除,如果连接时间设置是五分钟,那么这个连接在三分钟的时候timeout了还是得再等两分钟才能被清除。

那么问题就很明了,连接在三分钟的时候就已经和数据库断开了连接,但是默认连接的存活时间是五分钟,所以导致springboot项目开始能访问数据库,一会之后就不能访问数据库了。

解决方案
那么这样,假设说连接在三分钟的时候和数据库断开了连接,我们设置连接的存活时间是两分钟,连接就一直处于可用状态,当两分钟之后你再次访问数据库,就会new一个连接,这个连接在其生命周期内仍然是可用的。

大白话就是:
在application.yml中设置连接生命周期:

# 2分钟
spring.datasource.hikari.maxLifetime=120000
# 100秒
spring.datasource.hikari.idleTimeout=100000
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=50

HikariCP配置说明:

参数 描述 默认值 其他
autoCommit 自动提交从池中返回的连接 true -
connectionTimeout 等待来自池的连接的最大毫秒数 30000 如果小于250毫秒,则被重置回30秒
idleTimeout 连接允许在池中闲置的最长时间 600000 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!=0且小于10秒,则会被重置为10秒
maxLifetime 池中连接最长生命周期 1800000 如果不等于0且小于30秒则会被重置回30分钟
connectionTestQuery 如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性 null -
minimumIdle 池中维护的最小空闲连接数 10 minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize
maximumPoolSize 池中最大连接数,包括闲置和使用中的连接 10 如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值
metricRegistry 该属性允许您指定一个 Codahale / Dropwizard MetricRegistry 的实例,供池使用以记录各种指标 null -
healthCheckRegistry 该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息 null -
poolName 连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置 HikariPool-1 -
initializationFailTimeout 如果池无法成功初始化连接,则此属性控制池是否将 fail fast 1 -
isolateInternalQueries 是否在其自己的事务中隔离内部池查询,例如连接活动测试 false -
allowPoolSuspension 控制池是否可以通过JMX暂停和恢复 false -
readOnly 从池中获取的连接是否默认处于只读模式 false -
registerMbeans 是否注册JMX管理Bean(MBeans) false -
catalog 为支持 catalog 概念的数据库设置默认 catalog null -
connectionInitSql 该属性设置一个SQL语句,在将每个新连接创建后,将其添加到池中之前执行该语句。 null -
driverClassName HikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序,但对于一些较旧的驱动程序,还必须指定driverClassName null -
transactionIsolation 控制从池返回的连接的默认事务隔离级别 null -
validationTimeout 连接将被测试活动的最大时间量 5000 如果小于250毫秒,则会被重置回5秒
leakDetectionThreshold 记录消息之前连接可能离开池的时间量,表示可能的连接泄漏 0 如果大于0且不是单元测试,则进一步判断:(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0),会被重置为0 . 即如果要生效则必须>0,而且不能小于2秒,而且当maxLifetime > 0时不能大于maxLifetime
dataSource 这个属性允许你直接设置数据源的实例被池包装,而不是让HikariCP通过反射来构造它 null -
schema 该属性为支持模式概念的数据库设置默认模式 null -
threadFactory 此属性允许您设置将用于创建池使用的所有线程的java.util.concurrent.ThreadFactory的实例。 null -
scheduledExecutor 此属性允许您设置将用于各种内部计划任务的java.util.concurrent.ScheduledExecutorService实例 null -

参考:

http://www.tyzpower.cn/index.php/2020/06/09/hikaripool-1-failed-to-validate-connection-com-mysql-cj-jdbc-connectionimpl18e7d21c-no-operations-allowed-after-connection-closed/

https://www.cnblogs.com/carsonwuu/p/11188939.html


本文链接: http://www.dtmao.cc/news_show_50158.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?