相关文章推荐
怕考试的杯子  ·  Fastapi ...·  8 小时前    · 
大方的羽毛球  ·  博士申请 | ...·  1 年前    · 
想发财的滑板  ·  如何更新Flash ...·  1 年前    · 
千年单身的警车  ·  Dockerfile 的 RUN 和 ...·  1 年前    · 

Spring Boot多数据源配置及No operations allowed after connection closed连接异常的解决

最近项目上线,遇到了一个诡异的bug。

首先说下我的项目配置: SpringBooot + SpringMVC+SpringData JPA+ 两个MySql

也就是我这个项目配置了多数据源。

前期开发是没什么问题的,一切运转良好。

但是等到项目上线测试时,经常第二天测试人员就过来报告项目挂掉了。

经过查看日志才发现下面这个异常:

2018-01-27 08:09:15,361 - Servlet.service() for servlet [dispatcherServlet] in context with path [/shop] threw exception [Request processing failed;
 nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; 
 nested exception is javax.persistence.PersistenceException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
  No operations allowed after connection closed.] with root cause
java.net.SocketException: 断开的管道 (Write failed)......

注意排查异常要抓住重点: No operations allowed after connection closed。

从这个地方我们知道是mysql的链接关闭了已经。访问一个关闭了的链接当然会出现异常了。

之所以会出现这个异常,是因为MySQL5.0以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后(Mysql 服务器默认的“wait_timeout”是8小时),Mysql会自动把这个连接关闭。这就是问题的所在,在连接池中的connections如果空闲超过8小时,mysql将其断开,而连接池自己并不知道该connection已经失效,如果这时有 Client请求connection,连接池将该失效的Connection提供给Client,将会造成上面的异常。
所以配置datasource时需要配置相应的连接池参数,定是去检查连接的有效性,定时清理无效的连接。

那解决方法是什么呢?

在application.properties的两个数据源的配置下添加如下连接池配置:

#以下为连接池的相关参数配置
spring.datasource.primary.max-idle=10
spring.datasource.primary.max-wait=10000
spring.datasource.primary.min-idle=5
spring.datasource.primary.initial-size=5
spring.datasource.primary.validation-query=SELECT 1
spring.datasource.primary.test-on-borrow=false
spring.datasource.primary.test-while-idle=true
spring.datasource.primary.time-between-eviction-runs-millis=18800
#以下为连接池的相关参数配置
spring.datasource.secondary.max-idle=10
spring.datasource.secondary.max-wait=10000
spring.datasource.secondary.min-idle=5
spring.datasource.secondary.initial-size=5
spring.datasource.secondary.validation-query=SELECT 1
spring.datasource.secondary.test-on-borrow=false
spring.datasource.secondary.test-while-idle=true
spring.datasource.secondary.time-between-eviction-runs-millis=18800

之前也说了因为我是两个数据源,所以配置了两次。当然如果你只有一个数据源,配置一个就可以了。

这样上述异常就得到解决,其实出现该问题的原因,还是自己本人当时忽略了连接池的相关配置,以及对一些常见连接池的配置尚有欠缺,这里再补充一个小知识点,spring boot默认会优先使用的连接池是tomcat连接池,前提是在tomcat连接池可用的情况下

Spring Boot多数据源配置及No operations allowed after connection closed连接异常的解决最近项目上线,遇到了一个诡异的bug。首先说下我的项目配置: SpringBooot + SpringMVC+SpringData JPA+ 两个MySql也就是我这个项目配置了多数据源。前期开发是没什么问题的,一切运转良好。但是等到项目上线测试时,经常第二天测
Java与数据库(Mysql)打交道的时候,经常会出现一个错误:No operations allowed after connection closed.字面意思是:连接关闭后,不允许执行任何操作。 问题描述:struts2一个小项目中,要删除用户之前上传的照片。上传照片是通过上传到数据库中picture表(id,uid,name,url,这里uid是用户id,picture.id是自动增长)
2021-11-03 10:40:32.750 [TID:11458.146.16359072327350221] [http-nio-1192-exec-8] WARN com.zaxxer.hikari.pool.PoolBase -DatebookHikariCP - Failed to validate connection com.mysql 页面出现500,查看控制台错误出现No operations allowed after connection closed。 出现No operations allowed after connection closed。错误 ,说明mysql的链接已经关闭了。访问一个关闭了的链接当然会出现异常了。 之所以会出现这个异常,是因为MySQL5.0以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后(Mysql 服务器默认的“wait_timeout”是8小
这个报错一般是客户端连接已经被中断了,但客户端不知道,还想重用该连接,在重用的时候就会遇到no operations allowed after connection closed。 通过show processlist命令可以看到部分应用连接空闲时间很长(command字段为sleep,time为空闲时间)。 一、 可能导致该报错原因 数据库中 interactive_timeout 参数设置过短[10-86400] 数据库中 wait_timeout 参数设置过短[1-3153600...
使用mysql+cp30连接池时,报错No operations allowed after connection closed。从报错信息来看,是connection断开导致的错误。在网上搜索后发现,较新版本的mysql配置了connection的默认时间,默认时间一般为8个小时。超过了八个小时,mysql则会自动断开connection解决方法为: 在xml文件中增加property配置
**No operations allowed after connection closed错误原因及解决方法** **原因:** 我出现这个异常的原因是因为我在写代码时因为麻烦把这一个连接数据库的方法写成了全局变量,因为每一个都要写一遍,觉得很麻烦,所以我就想把他定义为全局变量,这样就可以省下了很多功夫。 之前在网上查了许多方法,自己尝试了许多,都没有解决这个问题。 在看了老师的代码之后发现不一样,便去尝试了一下,就行了 解决方法: 如果你连接数据库的代码时全局变量可以把你的代..