springboot多数据源配置及No operations allowed after connection closed连接异常
在一个项目中用到多个数据源,刚开始能正常工作,但是过了一个晚上就出现了异常,为什么?
springboot单数据源的配置
springboot 的单数据源配置比较简单,只需要在 resources/application.yml中,进行jdbc的相关配置就可以,配置如下:1
2
3
4
5
6
7
8spring:
profiles: pro
datasource:
url: jdbc:mysql://${dbServer:10.0.0.1}/dbtest?useSSL=false
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
springboot多数据源的配置
这里连接2种不同的数据库(mysql,postgresql)
mysql数据库的javabean配置:
1 |
|
postgresql数据库的javabean配置
1 | /** |
application.yml配置
1 | --- |
运行情况
配置好之后,能正常运行,但是超过一定时间后,会报错。
1 | Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. |
No operations allowed after connection closed错误原因及解决
之所以会出现这个异常,是因为MySQL5.0以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后(Mysql 服务器默认的“wait_timeout”是8小时),Mysql会自动把这个连接关闭。这就是问题的所在,在连接池中的connections如果空闲超过8小时,mysql将其断开,而连接池自己并不知道该connection已经失效,如果这时有 Client请求connection,连接池将该失效的Connection提供给Client,将会造成上面的异常。
修改application.yml的配置
1 | --- |
这样上述异常就得到解决,其实出现该问题的原因,还是自己本人当时忽略了连接池的相关配置,以及对一些常见连接池的配置尚有欠缺,这里再补充一个小知识点,spring boot默认会优先使用的连接池是tomcat连接池,前提是在tomcat连接池可用的情况下