com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败

Nic*_*ner 43 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 from the server.
Run Code Online (Sandbox Code Playgroud)

发生了什么?

用于获取连接的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 37

这是一个包装的例外,并不是很有趣.它是异常的根本原因,它实际上告诉我们一些根本原因.请在堆栈跟踪中进一步了解一下.你将面临一个SQLException: Connection refused或那个机会很大SQLException: Connection timed out.

如果在您的情况下也是如此,那么所有可能的原因是:

  1. JDBC URL中的IP地址或主机名是错误的.
  2. 本地DNS服务器无法识别JDBC URL中的主机名.
  3. JDBC URL中的端口号丢失或错误.
  4. 数据库服务器已关闭.
  5. 数据库服务器不接受TCP/IP连接.
  6. Java和DB之间的某些东西阻止了连接,例如防火墙或代理.

要解决其中一个问题,请遵循以下建议:

  1. 验证并测试它们ping.
  2. 刷新DNS或使用JDBC URL中的IP地址.
  3. 根据my.cnfMySQL DB 验证它.
  4. 启动它.
  5. 验证mysqld是否在没有该--skip-networking选项的情况下启动.
  6. 禁用防火墙和/或配置防火墙/代理以允许/转发端口.

顺便说一句(与实际问题无关),您不一定需要在每次 getConnection()调用时加载JDBC驱动程序.在启动期间只需一次即可.


小智 12

检查数据库服务器上设置的等待超时.有时它默认为10秒.这会在10秒内失去连接.

mysql> show global variables like '%time%' ;
Run Code Online (Sandbox Code Playgroud)

更新它使它像28800

mysql> SET GLOBAL wait_timeout = 28800;
Run Code Online (Sandbox Code Playgroud)


Jor*_*uez 5

我也遇到这个问题大约 8-9 天了。这是一些背景知识:我正在开发一个在 bash 中运行的简单 Java 应用程序。

细节:

  • 春天 2.5.6
  • Hibernate3.2.3.ga
  • 与行家。(项目基础来自mkyong.com,spring教程,无注释)
  • MySQL版本:
[jvazquez@archbox ~]$ mysql --version
mysql Ver 14.14 Distrib 5.5.9, for Linux (i686) using readline 5.1
Linux archbox 2.6.37-ARCH #1 SMP PREEMPT Fri Feb 18 16:58:42 UTC 2011 i686 Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz GenuineIntel GNU/Linux

该应用程序在 Arch Linux、Mac OS X 10.6 和 FreeBSD 7.2 中运行良好。当我将jar文件移动到不同主机的另一个arch linux时,使用相同的mysql,类似的my.cnf,以及类似的内核版本,连接死亡并获得与原始海报相同的错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败

我为此尝试了在 so 和论坛上找到的所有可能的组合(例如http://forums.mysql.com/read.php?39,180347,180347#msg-180347,现在已关闭,我可以t post .. ),特别是:

  • 三重检查我没有使用跳过网络。(用 ps aux 和 my.cnf 验证)
  • 尝试在 my.cnf 中启用 log_warnings=1 但显然,我没有访问服务器,所以在使用该应用程序时我什么也没看到
  • SHOW ENGINE innodb STATUS 根本没有显示任何东西;在测试期间我可以通过shell连接,php也连接到mysql服务器
  • /etc/hosts 有 localhost 127.0.0.1
  • 使用 localhost 和 127.0.0.1 尝试了 jdbc 属性,但没有结果
  • 尝试添加 c3p0 并更改 max_wait
  • my.cnf 中的最大连接数更改为 900 、 2000 并且仍然没有my.cnf
  • 添加 wait_timeout = 60 my.cnf
  • 添加 net_wait_timeout = 360 my.cnf
  • 添加了 destroy-method="close" spring.xml

正如它所指出的(如果你查找相同的异常,你会发现几个关于这个问题的线程Reproduce com.mysql.jdbc.exceptions.jdbc4.CommunicationsException,例如设置Spring、hibernate和C3P0 )。

  1. 如果您使用的是tomcat,请检查安全异常(再次,它在SO上,您会找到它)
  2. 检查您是否可以解析您正在使用的网址
  3. 尝试添加 c3p0。
  4. 确认没有防火墙拒绝您的连接
  5. 最后,如果您使用的是 GNU/Linux(例如 ARch linux 并且您确实获得了此异常),请尝试 MySQL 论坛 :: JDBC 和 Java :: EOFException:无法从服务器读取响应。预期读取4个字节,连接意外丢失前读取0个字节

如果链接被删除,只需将 mysqld:ALL 添加到 /etc/hosts.allow

我知道这有点牵强,但它可能对任何使用 GNU/Linux 并有此异常的人有所帮助,这个线程似乎是发布我的研究的最佳场所。

希望能帮助到你


Rah*_*hka 5

我得到了同样的错误,但后来我发现了它,因为那时Mysql服务器没有运行.

所以要改变服务器的状态

  1. 转到任务管理器
  2. 转到服务
  3. 然后搜索你的Mysql服务器(例如:对于我的情况,它的MYSQL56)
  4. 然后你会在状态栏下看到它表示它没有运行
  5. 右键单击并选择开始

希望这会有所帮助.