我有一个春季引导应用程序,在application.properties中启用了下面的application.properties属性,而在mysql中,wait_timeout = 28800
spring.datasource.hikari.minimumIdle=9
spring.datasource.hikari.maximumPoolSize=10
spring.datasource.hikari.maxLifetime=28799990
我仍然得到以下错误
13:02:46.103 http-nio-8082-exec-2警告com.zaxxer.hikari.pool.PoolBase - HikariPool-1 -无法验证连接com.mysql.cj.jdbc.ConnectionImpl@13f6e098 (连接关闭后不允许操作)。可能考虑使用较短的maxLifetime值。
我需要在HikariCP中设置哪些值来解决这个问题
提前感谢
编辑
@Autowired
JdbcTemplate jdbcTemplate;
public Map<String, Object> getSlideData(String date, String sp){
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName(sp)
.withoutProcedureColumnMetaDataAccess()
.useInParameterNames(ReportGeneratorConstants.TIMEPERIOD)
.declareParameters(
new SqlParameter(ReportGeneratorConstants.TIMEPERIOD,java.sql.Types.VARCHAR)
);
Map<String,String> map=new HashMap<>();
map.put(ReportGeneratorConstants.TIMEPERIOD, date);
return simpleJdbcCall.execute(map);
}
}
我使用simpleJdbcCall调用存储过程,我知道simpleJdbcCall使用多线程运行存储过程,我想知道的是,一旦执行()完成( spring引导负责关闭连接),simpleJdbcCall是否会释放/关闭池中的所有连接?
发布于 2022-10-18 19:15:48
可以终止连接的原因有很多。通常,在中间有一个防火墙,在一定的时间之后会中断连接。找出那是什么时间,并将最大寿命设置为至少1分钟之前。Hikari有一个过期连接的后台线程,但我认为它每隔几秒钟就触发一次;我提到这一点,因为它不精确到毫秒。
请注意,Hikari将尝试保持连接的minimumIdle数,因此通常新连接将在后台打开,不会在应用程序中创建等待新连接的暂停。
编辑
我不太熟悉Azure,所以我不确定一定时间后网络堆栈是否会减少连接。就我个人而言,我从来没有设置空闲超时或最长寿命设置,只要你有,因为连接下降的机会是相当高的云环境(在我的经验)。例如,在AWS中,我们的数据团队建议使用最长5分钟,空闲时间为1分钟,这是在一个高流量的平台上使用的。
打开DB连接非常快,通常发生在幕后。我的建议是使用这些设置,但您必须验证它们对于应用程序的负载是否正常(基于您在下面的注释中添加的设置):
# set this equal to maximum pool size if the traffic has burst
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=30
# It's the same as the default = 30 minutes
spring.datasource.hikari.maxLifetime=1800000
# It's the same as the default = 10 minutes
spring.datasource.hikari.keepalive-time=60000
https://stackoverflow.com/questions/74097987
复制相似问题