作者:陈芝麻烂谷子我勒个去 | 来源:互联网 | 2023-09-04 19:06
最近在做测试的时候,tomcat经常会出现下面一堆数据库异常信息,com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communica
最近在做测试的时候,tomcat经常会出现下面一堆数据库异常信息,
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 11,156 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.
at sun.reflect.GeneratedConstructorAccessor17.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3589)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3478)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4019)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2310)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at com.unionpay.cloudPayment.dao.PosSignInDao.select(PosSignInDao.java:84)
at com.unionpay.cloudPayment.bll.TransMsgLogBll.getMaxTraceNo(TransMsgLogBll.java:689)
at com.unionpay.cloudPayment.util.TraceNoUtil.genTraceNo(TraceNoUtil.java:14)
at com.unionpay.cloudPayment.wallet.msg.WalletMsgFactory.getServiceQueryReqMsg(WalletMsgFactory.java:45)
at com.unionpay.cloudPayment.wallet.servlet.ServiceQuery.doServiceQuery(ServiceQuery.java:78)
at com.unionpay.cloudPayment.wallet.servlet.ServiceQuery.doPost(ServiceQuery.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3036)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3489)
... 28 more
我系统都放在linux服务器上,我系统比较简单,就是一个servlet作为控制器的web系统,加上socket通信,
经过百度后知道大概意思是数据库连接由于超过连接的有效时间,变成了无效的连接,当再次请求时就会出现这种错误,
我查过了mysql的超时时间是14天,但是我启动tomcat没多久就会出现这种情况
在网上找了很多办法,第一种就是设置c3p0连接的有效时间MaxIdleTime=1800,启动一段时间仍然有这个错误,
于是尝试加上另外一个配置,就是每次执行数据库操作钱,执行一条简单的sql语句,
setPreferredTestQuery("select 1");
我是这样做的,但是重启tomcat一段时间后,继续出现上边的问题,而我数据库设置的超时时间为14天,所以不太理解为什么这么快就出错了,
求大神支招。。。。。。。。。。
16 个解决方案
mysql 连接数超限 查看代码 使用完之后将statment rs conn全部关闭掉。
检查mysql连接数目方式:利用xshell 等连接工具,连接mysql ,使用以下命令
show status like '%Threads_connected%'; 当前连接数
show status like '%Connections%'; 试图连接数量,不管是否成功
show status like '%Max_used_connections%'; 服务器启动后已同时使用的最大连接数
怎么解决了呢?我修改了等待时间后还会有时候回出现这个情况? 能分享下解决方案么?