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

时间:2014-02-23 03:43:20

标签: java mysql jdbc connection

我尝试连接到我的远程MySQL数据库,但是我失败了并且遇到了这个错误。

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

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

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

这是我的代码(它可以在我的localhost数据库上运行):

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

任何人都可以帮助我吗?

10 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

通常,当您没有使用正确的端口号时会发生此错误。可能是在此数据库上工作的计算机(客户端&#39; db)具有不同的端口号。 (例如:3307)。
Go任务管理器==&gt;服务==&gt;服务和检查是否有其他版本的mysql。如果他们使用3306将您的端口更改为3307.

答案 2 :(得分:1)

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

答案 3 :(得分:1)

将您的云端硬盘版本更新为:

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

答案 4 :(得分:1)

我通过从连接URL中删除端口号来解决它。

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

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

使用

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

答案 5 :(得分:1)

  

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

这可能是在当地完成的。所以它与您的代码无效的原因无关。

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

以下是一些解决方案:

  • 更改“bind-address”属性

取消注释“bind-address”属性或将其更改为以下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 =否

  • 使用validationQuery属性

使用validationQuery =“select now()”确保每个查询都有回复

  • autoReconnect的

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

如果您正在使用Amazon Ubuntu实例,则必须执行以下步骤:

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

答案 8 :(得分:0)

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

默认情况下,MySQL仅允许来自localhost地址的连接。配置文件通常位于/etc/mysql/my.cnf

您需要将绑定地址行注释掉,如下所示:

#bind-address     = 127.0.0.1

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

sudo /etc/init.d/mysql restart

答案 9 :(得分:0)

我已经遇到了这个问题,并且挣扎了很多。我做了所有门户网站上说的所有事情,但对我却不起作用。对我唯一起作用的是将jar文件更新为当前的新版本。之前我使用的是5.1.38,现在更新为8.0.15,只是我的程序运行良好。