我当前正在运行一些java代码,它对mysql数据库进行大量调用。这些调用淹没了数据库,在代码运行几个小时后,我收到了一个嵌套异常:
java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1934)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2380)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2909)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:798)
at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3700)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1203)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2572)
Last packet sent to the server was 8789 ms ago.
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2592)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2909)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:798)
at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3700)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1203)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2572)
不幸的是,我对此类问题没有太多经验,任何人都可以推荐一些方法来确保我的所有查询都能得到处理吗?
我可以理解这是一个非常广泛的问题,但查询本身并不困难,更多的是我请求的查询数量的规模。
谢谢
最佳答案
我会在 OS/MySql/Web 服务器级别解决此问题。换句话说,这本身不是“Java”问题。这可能更多是一个“系统性能/系统配置”问题。
建议:
1) 您还没有指定您的操作系统、Web 服务器/应用程序服务器。这些是关键。
2) 运行基本性能检查(Linux 下为 ps -eaf 和 iostat,Windows 下为 Task Mgr/CPU/Memory/Networking stats)。特别注意“netstat”(Linux 和 Windows)。
3) 查看所有相关日志(Linux 的/var/log/messages 等;Windows 的 EventVwr 等)
4) 检查您的操作系统、数据库和 Web 服务器配置设置。
5) 特别注意可能的“失效连接”和与数据库相关的“连接池”参数。
检查这些链接:
Communications link failure due to: java.io.EOFException <= 设置 Tomcat“autoReconnect=true” ...如果您正在运行 Tomcat!
http://sacharya.com/grails-dbcp-stale-connections/ <= 调整连接池参数
http://communications-link-failure.blogspot.com/ <=减少mysql wait_timeout
关于java代码大量使用mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12127314/