Java com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
我连接到MySQL数据库的程序运行良好。然后,在不更改用于设置连接的任何代码的情况下,我得到以下异常:Java com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障,java,mysql,jdbc,Java,Mysql,Jdbc,我连接到MySQL数据库的程序运行良好。然后,在不更改用于设置连接的任何代码的情况下,我得到以下异常: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
发生了什么事
用于获取连接的代码:
private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
String username = "user";
String password = "pass";
String url = "jdbc:mysql://www.domain.com:3306/dbName?connectTimeout=3000";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
这是一个包装的异常,并不是很有趣。异常的根本原因实际上告诉了我们一些关于根本原因的信息。请进一步查看stacktrace。然后您很有可能会遇到
SQLException:Connection-densed
或SQLException:Connection-timed-out
如果您的情况也是如此,那么所有可能的原因都是:
ping
验证并测试它们my.cnf
进行验证--skip networking
选项的情况下启动顺便说一句(与实际问题无关),您不必在每次调用
getConnection()
时都加载JDBC驱动程序。启动期间只需一次就足够了。我们有一个使用Apache commons连接池的软件(带有Tomcat的webapp),多年来一直运行良好。上个月,由于遇到一个老bug,我不得不更新库。该漏洞已在最新版本中修复
在部署这个之后不久,我们就开始得到这些消息。在我们每天收到的数千个连接中,有少数(通常不到10个)会收到此错误消息。没有真正的模式,只是它们有时会聚集在2到5个小组中
我将选项更改为on the pool,以便在每次从池中取出或放回池中时验证连接(如果发现一个连接不好,则生成一个新的连接),问题就消失了
你最近更新过你的MySQL jar吗?看起来可能有一个新的设置在我们(承认是非常旧的)罐子里不曾出现过
我同意BalusC在您的配置中尝试一些其他选项,例如您要传递给MySQL的选项(除了连接超时)
如果这个失败像我的一样是暂时的,而不是永久的,那么您可以使用一个简单的try/catch和一个循环来继续尝试,直到事情成功,或者使用连接池来为您处理这个细节
另一个随机想法:我不知道为什么尝试使用封闭连接会发生什么情况(会出现什么异常)。您可能在某处意外关闭了连接吗?正如BalusC所提到的,发布完整的堆栈跟踪非常有用(始终发布完整的堆栈跟踪,只有堆栈跟踪的第一行是无用的,也是令人沮丧的)
无论如何,您提到您的代码工作正常,并且这个问题在没有任何代码更改的情况下突然发生,因此我想知道这是否与您的其他问题有关,如果这个问题是在调试时开始的,那么我想是(您的连接已用完)。在这种情况下,请重新启动数据库服务器(并按照另一个问题的建议来避免这种情况)。我也已经有了8-9天的时间。 以下是一些背景:我正在开发一个在bash中运行的简单Java应用程序 详情:
- 春季2.5.6
- Hibernate3.2.3.ga
- 和maven在一起。 (该项目的基础来自mkyong.com,这是一个没有命名的春季教程)
- MySQL版本:
- 三次检查我没有使用skip 网络。(与ps aux核实) 和my.cnf)
- 尝试在my.cnf中启用log_warnings=1,但很明显,我没有点击 所以我在使用应用程序时没有看到任何东西
- 显示引擎innodb状态根本没有显示任何内容;在测试期间,我可以通过shell连接,php也可以连接到mysql服务器
- /etc/hosts具有localhost 127.0.0.1
- 使用localhost和127.0.0.1尝试jdbc属性,但没有结果
- 尝试添加c3p0并更改了最大等待时间
- my.cnf中的最大连接数已更改为9002000,但my.cnf中仍然没有任何连接
- 添加了等待超时=60 my.cnf
- 添加了净等待超时=360 my.cnf
- 添加了destroy method=“close”spring.xml
mysql> show global variables like '%time%' ;
mysql> SET GLOBAL wait_timeout = 28800;