本地开发环境下MySQL突然断开连接的问题排查求助
MySQL突发连接断开(EOFException)排查与解决
环境信息
- 后端技术栈:Java
- 前端技术栈:JSP、jQuery、HTML、CSS
- 数据库版本:MySQL Ver 14.14 Distrib 5.7.28, for macos10.14 (x86_64)
- 应用服务器:Apache Tomcat 8.5
报错信息
连接断开时抛出如下异常:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913) at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:501) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:971) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2644) at com.mysql.jdbc.Connection.<init>(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:208) at com.vitgusa.vedi.util.DBUtils.newConnection(DBUtils.java:50) at org.apache.jsp.proc.error_jsp._jspService(error_jsp.java:145) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.vitgusa.vedi.util.XSSFilter.doFilter(XSSFilter.java:40) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:750) ** END NESTED EXCEPTION ** Last packet sent to the server was 0 ms ago. at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:569) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:971) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2644) at com.mysql.jdbc.Connection.<init>(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:208) at com.vitgusa.vedi.util.DBUtils.newConnection(DBUtils.java:50) at org.apache.jsp.proc.error_jsp._jspService(error_jsp.java:145) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.vitgusa.vedi.util.XSSFilter.doFilter(XSSFilter.java:40) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:750) com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
当前MySQL配置(my.cnf)
sql-mode="" #skip-networking bind-address="127.0.0.1" #wait_timeout=300 #interactive_timeout = 300
排查与解决方案
1. 定位MySQL进程崩溃原因
- 查看MySQL错误日志:执行
mysqladmin variables | grep log_error获取日志路径,检查崩溃前是否存在表损坏、内存溢出、线程死锁等异常记录。 - 监控系统资源:用
top或Activity Monitor观察MySQL的CPU、内存占用,确认是否因资源耗尽被系统强制终止;查看系统日志/var/log/system.log,搜索mysql、kill、memory关键词,排查是否有OOM(内存不足)杀进程的情况。
2. 修复连接管理漏洞
- 检查
DBUtils.newConnection实现:若每次请求都通过DriverManager新建连接且未正确关闭,会导致连接泄露,耗尽MySQL连接数甚至引发进程异常。 - 替换为连接池:使用HikariCP、C3P0等连接池组件,自动处理连接复用、超时回收与健康检查,避免手动管理连接的疏漏。
3. 调整连接超时配置
启用并合理调整my.cnf中的超时参数:
wait_timeout=3600 interactive_timeout=3600
修改后重启MySQL,避免闲置连接被MySQL主动断开后客户端未感知引发的通信异常。
4. 验证JDBC驱动兼容性
当前使用的com.mysql.jdbc.Driver为旧版驱动,MySQL 5.7建议搭配mysql-connector-java 5.1.47及以上版本,或升级到com.mysql.cj.jdbc.Driver(8.0系列驱动,向下兼容5.7),旧驱动可能存在与MySQL 5.7通信协议不兼容的问题,导致突发断开。
5. 检查数据库完整性与版本
- 执行
mysqlcheck --all-databases检查所有数据库表是否损坏,表损坏可能触发MySQL进程崩溃。 - 升级MySQL到5.7系列最新稳定版(如5.7.44),修复旧版本存在的已知进程崩溃bug。
6. 排查系统网络问题
- 断开时执行
telnet 127.0.0.1 3306测试本地端口连通性,确认是否有防火墙或网络配置临时拦截MySQL端口。
内容的提问来源于stack exchange,提问作者Halit Ciftci
相关产品推荐
相关产品推荐

