Java HikariCP与maxlife

Java HikariCP与maxlife,java,connection-pooling,hikaricp,Java,Connection Pooling,Hikaricp,我把我的项目转移到了。到目前为止一切都很顺利,但有一次我遇到了麻烦 这是HikariConfig对象中的.setMaxLifetime(30*1000)设置。我收到这个警告 WARN com.zaxxer.hikari.HikariConfig - maxLifetime is less than 120000ms, using default 1800000ms. 我知道他们建议不要像我想的那么低。但不幸的是,由于我无法更改的情况,在我们的生产环境中,每一个打开时间超过50秒的TCP连接都将

我把我的项目转移到了。到目前为止一切都很顺利,但有一次我遇到了麻烦

这是HikariConfig对象中的
.setMaxLifetime(30*1000)
设置。我收到这个警告

WARN com.zaxxer.hikari.HikariConfig - maxLifetime is less than 120000ms, using default 1800000ms.

我知道他们建议不要像我想的那么低。但不幸的是,由于我无法更改的情况,在我们的生产环境中,每一个打开时间超过50秒的TCP连接都将被终止。

我不知道您的
HikariCP
版本,但在版本2.2.4中,您将找到它抛出上述警告的原因。
HikariConfig.class
(在
com.zaxxer.hikari.HikariConfig
中):

根据此代码,
maxLifeTime
在此版本中已至少更新为30000ms

因此,如果要将maxLifeTime设置为30000ms,请将您的
HikariCP
版本更新为最新版本2.7.4

但是,如果您使用JDK 8将HikariCP版本更新为2.7.4,我还向您推荐两点:

1。将
maxLifeTime
值设置为至少30000ms。


2。设置
maxLifeTime
值比mysql的
wait\u timeout
少几分钟(
显示变量,如“%timeout%”
),以避免断开连接异常。

使用Hikari 2.7.9版,我进行了以下设置:

HikariConfig cpConfig = new HikariConfig();
cpConfig.setJdbcUrl(jdbcUrl);
cpConfig.setUsername(username);
cpConfig.setPassword(password);
cpConfig.setMaximumPoolSize(15);
cpConfig.setConnectionTestQuery("SELECT 1");

// performance senstive settings
cpConfig.setMinimumIdle(0);
cpConfig.setConnectionTimeout(30000);
cpConfig.setIdleTimeout(35000);
cpConfig.setMaxLifetime(45000);

cpConfig.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

HikariDataSource cpDatasource = new HikariDataSource(cpConfig);
localContainerEntityManagerFactoryBean.setDataSource(cpDatasource);
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
localContainerEntityManagerFactoryBean.afterPropertiesSet();
它是有效的。 但请注意:

 cpConfig.setMinimumIdle(0);
如果您的数据库(如MSSQL)具有无限的MaxLifetime,则必须严格将其设置为0,否则您将有许多连接未无限(无限)关闭

干杯,

Artanis Zeratul

您需要为此打开一个增强请求。作为一种临时解决方法,这是一种黑客行为,但在池通过JMX启动后,您可以更改
maxLifetime
,而无需执行检查。查看此wiki页面以获取编程访问:哦,我没有想过通过JMX设置它,我会尝试一下。并提交了一个功能请求,想知道他们会说什么我正在使用MSSQL。默认情况下,MSSQL设置为600s或600000ms。然后我设置maxLifeTime==600000,但仍然得到错误/警告:idleTimeout接近或超过maxLifeTime。如果我把它设置在30秒以内,570000,也是一样。有趣的是如果我不设定这个。。。只需使用默认值30分钟,错误就会消失,但我不确定这是否能保证没有断开的连接,因为现在情况正好相反。@ArtanisZeratul您的HikariCP的版本是什么?HikariCP-2.7.9.jar和hibernate-HikariCP-5.2.17.Final.jar,我不确定是哪一个,因为我只是让Spring引导依赖项进行版本管理。我使用的springboot是SpringBootStarter的父版本2.0.5.RELEASE。@ArtanisZeratul您能调试HikariConfig.class吗?我很乐意。但是我现在没有时间,我将在下周检查。是的,HikariCP配置建议不要设置此值。
HikariConfig cpConfig = new HikariConfig();
cpConfig.setJdbcUrl(jdbcUrl);
cpConfig.setUsername(username);
cpConfig.setPassword(password);
cpConfig.setMaximumPoolSize(15);
cpConfig.setConnectionTestQuery("SELECT 1");

// performance senstive settings
cpConfig.setMinimumIdle(0);
cpConfig.setConnectionTimeout(30000);
cpConfig.setIdleTimeout(35000);
cpConfig.setMaxLifetime(45000);

cpConfig.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

HikariDataSource cpDatasource = new HikariDataSource(cpConfig);
localContainerEntityManagerFactoryBean.setDataSource(cpDatasource);
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
localContainerEntityManagerFactoryBean.afterPropertiesSet();
 cpConfig.setMinimumIdle(0);