今天使用springboot遇到了这样的问题:
springboot项目启动开始可以访问数据库,但是几分钟之后就会报错
idea报错信息:
HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@18e7d21c (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.
这玩意啥意思呢,意思就是当你用springboot连接数据库的时候,会建立一个和数据库的连接,这个连接保存在数据库连接池中,现在你的这个连接已经time out已经不能用了,但是你的这个连接还是保存在数据库连接池中,springboot仍然使用这个连接去连接数据库,所以才会报错。
那么知道了原因,我们怎么解决这个问题呢,首先要知道我们可以设置连接在连接池中的存活时间,什么是连接的存活时间呢,简而言之就是你这个连接要保存在连接池中多长时间才被清除,如果你连接时间设置是五分钟,那么这个连接在三分钟的时候timeout了还是得再等两分钟才能被清除。
那么问题就很明了,你的连接在三分钟的时候就已经和数据库断开了连接,但是你默认连接的存活时间是五分钟,所以导致你的springboot项目开始能访问数据库,一会之后就不能访问数据库了
解决方案
那么这样,假设说连接在三分钟的时候和数据库断开了连接,我们设置连接的存活时间是两分钟,连接就一直处于可用状态,当两分钟之后你再次访问数据库,就会new一个连接,这个连接在其生命周期内仍然是可用的。
大白话就是:
在
a
p
p
l
i
c
a
t
i
o
n
.
p
r
o
p
e
r
t
i
e
s
application.properties
application.properties中设置连接生命周期:
spring.datasource.hikari.max-lifetime=120000
如果还是不行你还可以设置的更小:60000
但是不能小于30000,这是默认的最小值,你想想如果你设置一个连接的生命周期是1000,也就是一秒,那么你基本每次访问数据库都要new一个连接,这样太耗费资源了。