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)......
1
2
3
4
5
6
7
8
注意排查异常要抓住重点: 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
1
2
3
4
5
6
7
8
9
10
#以下为连接池的相关参数配置
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
1
2
3
4
5
6
7
8
9
10
之前也说了因为我是两个数据源,所以配置了两次。当然如果你只有一个数据源,配置一个就可以了。
这样上述异常就得到解决,其实出现该问题的原因,还是自己本人当时忽略了连接池的相关配置,以及对一些常见连接池的配置尚有欠缺,这里再补充一个小知识点,spring boot默认会优先使用的连接池是tomcat连接池,前提是在tomcat连接池可用的情况下
---------------------
作者:PostTruth
来源:CSDN
原文:https://blog.csdn.net/itguangit/article/details/79178155
版权声明:本文为博主原创文章,转载请附上博文链接!
分享到:
相关推荐
解决:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed.
使用mysql+cp30连接池时,报错No operations allowed after connection closed。从报错信息来看,是connection断开导致的错误。在网上搜索后发现,较新版本的mysql配置了connection的默认时间,默认时间一般为8个...
Navicat for MySQL 远程连接错误 1130 解决方法 Navicat for MySQL 是一款功能强大的数据库管理工具,但是在远程连接 MySQL 服务器时,可能会遇到错误 1130,这是因为 MySQL 服务器不允许从远程主机连接。下面我们...
### MySQL 5.7 中 max_allowed_packet 参数的理解与调整 #### 一、max_allowed_packet 参数简介 在MySQL数据库中,`max_allowed_packet` 参数用于控制客户端与服务器之间单个数据包的最大大小。此参数对诸如大BLOB...
MySQL中的异常处理是数据库编程中不可或缺的一部分,它允许开发者预设对可能出现的错误或异常的响应,从而确保程序的稳定性和健壮性。在MySQL中,异常定义和处理主要是通过`DECLARE`语句来实现的。 1. **异常定义**...
### 远程用户连接MySQL授权详解 #### 一、引言 随着互联网技术的发展与企业规模的扩大,数据库系统的远程访问需求日益增加。对于MySQL这样的关系型数据库管理系统而言,实现远程用户连接授权变得尤为重要。本文将...
Host 主机名 is not allowed to connect the mysql server 原因:没有授权远程访问mysql 解决方法: cmd 中运行mysql -u root -p(如果报mysql 不是内部或外部命令,找到安装mysql对应的bin文件夹运行mysql.exe,...
"MySQL连接问题解决方案" 在使用MySQL数据库时,可能会遇到"Host 'localhost' is not allowed to connect to this MySQL server"的错误信息,这是由于MySQL的安全机制所致。MySQL的安全机制是基于主机名和用户名的...
MySQL导入sql脚本错误:2006 – MySQL server has gone away 到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24 Line no.:85 Error Code: 2006 - MySQL ...
### MySQL无法进行远程连接的解决方法 在使用MySQL数据库时,有时可能会遇到无法从远程主机进行连接的问题。本文将详细探讨这一问题的原因以及提供几种有效的解决策略。 #### 一、问题背景与现象 当你尝试从远程...
总之,解决“MySQL数据库连接过多的错误”涉及监控连接状态、调整配置参数、优化连接管理和代码审查。通过以上方法,可以有效提高数据库系统的并发能力,确保其稳定运行,避免因连接数过多而导致的服务中断。在日常...
mysql设置max_allowed_packet_解决_MySQL_Error_2006
在使用mysql的过程中,有个问题就是mysql的优化,mysql中longblob字段在5.5版本中默认的为1M。 想改变这个问题,需要注意几点: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2054817 > ...
在使用MySQL数据库时,有时会遇到“ERROR 1130: Host ‘192.168.1.3’ is not allowed to connect to this MySQL server”的错误,这意味着当前的用户账户没有权限从指定的远程主机进行连接。解决这个问题通常涉及到...
MySQL中的`max_allowed_packet`参数是一个非常重要的设置,它决定了MySQL服务器能够接收的最大数据包大小。这个设置在处理大数据操作,如导入大体积的数据文件、执行包含大量数据的SQL语句时尤其关键。如果某个...
在使用Navicat for MySQL进行远程连接时,如果遇到了错误代码1130(`ERROR 1130: Host 'IP地址' is not allowed to connect to this MySQL server`),这通常意味着MySQL服务器不允许来自该特定IP地址的连接。...
在MySQL数据库系统中,`max_allowed_packet`是一个非常重要的配置参数,它决定了服务器可以处理的最大数据包大小。这个参数主要用于限制单次传输的数据量,防止因大数据操作导致内存溢出或者网络阻塞。在MySQL 5.5...
注意MySQL对单个命令大小的限制,可通过`max_allowed_packet`属性调整。 ```csharp // 使用StringBuilder高效拼接字符串 var sqlBuilder = new StringBuilder(); // 添加insert 语句的头 string sqlHeader = ...
NULL 博文链接:https://rayoo.iteye.com/blog/1973032