“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接故障”到远程数据库

Posted

技术标签:

【中文标题】“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接故障”到远程数据库【英文标题】:"com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure" to remote database 【发布时间】:2014-03-24 17:00:15 【问题描述】:

我尝试连接到远程 mysql 数据库,但失败并出现此错误。

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

困惑的是,我使用MySQL-Front工具连接远程数据库时有效,并且可以成功ping到IP地址。但是当我使用我的代码时,它会在大约十秒钟后显示错误。

此外,当我在代码中使用错误的用户名或密码时,它会立即显示错误的验证。这是否证明建立连接没有问题?

这是我的代码(它可以在我的本地主机数据库上运行):

public static void main(String[] args) 
        String url = "jdbc:mysql://(IP address):3306/";
        String dbName = "talk";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "talkroot";
        String password = "123456";
        try 
            Class.forName(driver).newInstance();
            Connection conn = DriverManager.getConnection(url + dbName,
                    userName, password);
            System.out.println("connect");
            conn.close();
         catch (Exception e) 
            e.printStackTrace();
        
        System.out.println("end");
    

这是错误:

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

Last packet sent to the server was 0 ms ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2120)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:723)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.test.TestMySQL.main(TestMySQL.java:16)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 21298 ms ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3009)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2895)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3438)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548)
    at com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1802)
    at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3444)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2062)
    ... 12 more
Caused by: java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2452)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2906)
    ... 20 more

谁能帮帮我?

【问题讨论】:

你的mysql服务器在运行吗?搜索软件导致连接中止:recv failed 它正在运行。我可以连接它并使用MySQL-Front进行操作。 长期连接MySQL-Front会超时吗? 我从不尝试这个。如果发生伤口,有什么问题? 请参考以下网址:***.com/questions/2983248/… 【参考方案1】:

我曾经遇到过这个问题,并且非常挣扎。我做了所有门户网站上所说的所有事情,但对我没有用。唯一对我有用的是将我的 jar 文件更新到当前的新版本。早些时候我使用的是 5.1.38,现在更新到 8.0.15,我的程序运行得非常好。

【讨论】:

【参考方案2】:

请在 /etc/mysql/my.cnf 文件中更新你的 mysql 配置文件

默认情况下,MySQL 只允许来自 localhost 地址的连接。配置文件一般在/etc/mysql/my.cnf

您需要注释掉绑定地址行,使其看起来像这样:

#bind-address     = 127.0.0.1

接下来,您需要重新启动数据库服务器:

sudo /etc/init.d/mysql restart

【讨论】:

【参考方案3】:

如果您使用的是 Amazon Ubuntu 实例,那么您必须按照以下步骤操作:

    检查亚马逊实例 检查实例的安全组 分配 mysql/aura 服务并在此处添加您的计算机 ip 或 服务提供商ip

【讨论】:

【参考方案4】:

您的 MySQL 服务器没有运行。如果您正在运行 Windows,请在任务管理器的服务页面中检查相同的内容。

【讨论】:

【参考方案5】:

此外,当我在代码中使用错误的用户名或密码时,它会立即显示错误的验证。这是否证明建立连接没有问题?

这可能是在本地完成的。因此它与您的代码无法正常工作的原因无关。

似乎有很多方法可以解决这个问题,因此您可以尝试多种方法;人们根据自己的情况以不同的方式解决了此链接故障:

以下是一些解决方案:

更改“绑定地址”属性

取消注释“绑定地址”属性或将其更改为以下 IP 之一:

绑定地址="127.0.0.1"

绑定地址="0.0.0.0"

注释掉“skip-networking”

如果您的 MySQL 配置文件中有“skip-networking”行,请在该行的开头添加“#”符号以使其注释。

更改“wait_timeout”和“interactive_timeout”

将这些行添加到 MySQL 配置文件中:

[wait_timeout][1] = 数字

interactive_timeout = 数字

connect_timeout = 数字

检查操作系统代理设置

确保防火墙或防病毒软件不会阻止 MySQL 服务。

更改连接字符串

检查您的查询字符串。你的连接字符串应该是这样的:

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

确保字符串中没有空格。所有的连接字符串都应该继续,没有任何空格字符。

尝试将“localhost”替换为您的端口,例如 127.0.0.1。 还可以尝试将端口号添加到您的连接字符串中,例如:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

MySQL 的默认端口通常是 3306。

不要忘记将用户名和密码更改为您的 MySQL 服务器的用户名和密码。

更新您的 JDK 驱动程序库文件 测试不同的 JDK 和 JRE(如 JDK 6 和 7) 不要更改 max_allowed_pa​​cket

"[max_allowed_pa​​cket][4]" 是 MySQL 配置文件中的一个变量,表示最大数据包大小,而不是最大数据包数。所以解决这个错误无济于事。

更改 tomcat 安全性

将 TOMCAT6_SECURITY=yes 更改为 TOMCAT6_SECURITY=no

使用 validationQuery 属性

使用 validationQuery="select now()" 确保每个查询都有响应

自动重新连接

将此代码添加到您的连接字符串:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

【讨论】:

【参考方案6】:

我通过从连接 URL 中删除端口号解决了这个问题。

所以不要使用连接字符串作为:

jdbc:mysql://12x.xxx.xxx.xxx:1527/yourdbname

使用

jdbc:mysql://12x.xxx.xxx.xxx/yourdbname

【讨论】:

【参考方案7】:

仔细检查以下内容:

验证IP地址/端口号是否正确 使用 ping “IP 地址” ping 服务器可能会告诉服务器处于启动模式/关闭模式 如果您从连接池中获取连接对象,请验证 一旦连接可用。

希望这些信息对您有所帮助...

【讨论】:

【参考方案8】:

将您的驱动器版本更新为:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>

【讨论】:

【参考方案9】:

通常当您没有使用正确的端口号时会发生此错误。可能是在这个数据库(client'db)上工作的机器有不同的端口号。 (例如:3307)。 去任务管理器==> 服务==> 服务并检查是否有其他版本的mysql。如果他们使用 3306,请将您的端口更改为 3307。

【讨论】:

【参考方案10】:

如果您的数据库连接长时间处于空闲状态,则会出现此 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException 异常。此空闲连接在 connection.isClosed() 上返回 true;但是如果我们尝试执行语句,那么它会触发这个异常,所以我建议使用数据库池。

【讨论】:

【参考方案11】:

您可以尝试替换 mysql-connector-java-version.jar jar 文件。有些人将 jar 文件从 5.1.10 更新到 5.1.14,然后它就可以工作了。祝你好运..

【讨论】:

以上是关于“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接故障”到远程数据库的主要内容,如果未能解决你的问题,请参考以下文章

JDBC未知列