com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure

2022-09-01 01:31:18

我的连接到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.

发生了什么事?

用于获取连接的代码:

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;
}

答案 1

这是一个包装的异常,并不真正有趣。它是异常的根本原因,它实际上告诉我们一些关于根本原因的信息。请在堆栈跟踪中进一步查看。很有可能,您将面临一个 或 .SQLException: Connection refusedSQLException: 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. 根据 MySQL DB 对其进行验证。my.cnf
  4. 启动它。
  5. 验证 mysqld 是否在没有该选项的情况下启动。--skip-networking
  6. 禁用防火墙和/或配置防火墙/代理以允许/转发端口。

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


答案 2

检查数据库服务器上设置的等待超时。有时它默认为10秒。这将在 10 秒内断开连接。

mysql> show global variables like '%time%' ;

更新它使它类似于28800

mysql> SET GLOBAL wait_timeout = 28800;

推荐