1.1 异常原因
MySQL 5.0 以后针对超长时间数据库连接做了一个处理,即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时),MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时,MySQL 将其断开,而数据库连接池并不知道该 connection 已经失效,这个时候你请求数据库链接,连接池会将失效的 connection 给你,so~,SpringBoot 温柔的告诉你 No operations allowed after connection closed
。SpringBoot 2.0 以上版本,mysql-connector-java 默认使用的是 8.0 以上版本。
1.2 解决办法
1.2.1 hikari 数据库连接池配置
☞ 概述 SpringBoot 2.0 开始推 HikariCP,将默认的数据库连接池从 tomcat jdbc pool 改为了 hikari,HikariCP 在性能和并发方面确实表现不俗(号称最快的连接池)。使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa,会自动添加对 HikariCP 的依赖,也就是说此时使用 HikariCP。通过在 application.properties 或 application.yml 中配置 spring.datasource.type 指定数据库连接池,强制使用其它的连接池技术。
☞ 示例
spring: datasource: hikari: # 连接池最大连接数,默认是 10 maximum-pool-size: 60 # 链接超时时间,默认 30000(30 秒) connection-timeout: 60000 # 空闲连接存活最大时间,默认 600000(10 分钟) idle-timeout: 60000 # 连接将被测试活动的最大时间量 validation-timeout: 3000 # 此属性控制池中连接的最长生命周期,值 0 表示无限生命周期,默认 1