😕今天使用springboot写好一个接口,准备测试的时候,控制台打印了报错信息
从图中可以得到以下几个关键信息😎:
- 数据库连接池使用的是HikariCP
- Possibly consider using a shorter maxLifetime value.(可以考虑使用更短的最大存活时间。)
- 最关键的异常:ConnectionIsClosedException,表示连接数据库的Connection已经关闭了
- 报错原因:过长的空闲时间导致连接超时并关闭,从而引发
ConnectionIsClosedException
错误。
从依赖和官方文档都可以证明,确实使用了Hikari连接池
📄下面这段话引用自Springboot官方文档
Supported Connection Pools
Spring Boot uses the following algorithm for choosing a specific implementation:
- We prefer HikariCP for its performance and concurrency. If HikariCP is available, we always choose it.
- Otherwise, if the Tomcat pooling
DataSource
is available, we use it.- Otherwise, if Commons DBCP2 is available, we use it.
- If none of HikariCP, Tomcat, and DBCP2 are available and if Oracle UCP is available, we use it.
If you use the
spring-boot-starter-jdbc
orspring-boot-starter-data-jpa
"starters", you automatically get a dependency toHikariCP
.
意思是说,Springboot会优先使用HikariCP作为连接池,如果它不可用,才会考虑使用Tomcat的连接池,然后才是Commons DBCP2、Oracle UCP
以下引用了Chatgpt的回答
在 Spring Boot 1.x 版本中,默认的数据库连接池是 Tomcat JDBC 连接池(tomcat-jdbc)。但是从 Spring Boot 2.x 开始,HikariCP 取代了 Tomcat JDBC 成为默认的连接池。这是因为 HikariCP 具有出色的性能和高效的连接管理,被广泛认为是目前最快速和最轻量级的连接池之一。想要明确地指定使用 Tomcat JDBC 连接池,可以在项目的配置文件中进行相应的配置。
😃整理了网上搜索到的大部分解决方案
-
⭐方案一(不推荐):将 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver 改为 spring.datasource.driverClassName=com.mysql.jdbc.Driver ,不推荐,因为使用cj的连接速度比旧版的更快。
-
⭐方案二:MySQL5 之前的版本,修改连接配置中的 URL添加参数:autoReconnect=true
-
⭐方案三(不推荐):MySQL5 及以后的版本,需要修改 my.cnf (或者my.ini ) 文件,在 [mysqld] 后面添加上:
ini# n为自定义的时间,单位:秒 wait_timeout = n interactive-timeout = n
-
⭐⭐⭐方案四:修改连接池配置,查阅HikariCP官方的Configuration文档。注意,HikariCP使用毫秒作为时间值
关于 maxLifetime
控制池中连接的最长生存期。正在使用的连接永远不会停用,只有在关闭时才会将其删除。强烈建议设置此值 ,并且它应该比任何数据库或基础结构施加的连接时间限制短几秒钟。值为 0 表示没有最大生存期(无限生存期),当然受 idleTimeout 设置的约束。允许的最小值为 30000 毫秒(30 秒)。默认值:1800000(30 分钟)
配置如下,设置 maxLifetime 为20分钟