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

我试图连接到我的远程MySQL数据库,但我失败了并得到了这个错误。

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

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

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

这是我的代码(它可以在我的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.(ConnectionImpl.java:723) at com.mysql.jdbc.JDBC4Connection.(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 

有人可以帮我吗?

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

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

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

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

  mysql mysql-connector-java 5.1.18 

双重检查以下内容:

  • validationIP地址/端口号是否正确
  • 使用ping“IP地址”ping服务器,它可能告诉服务器处于启动模式/关闭模式
  • 如果要从连接池获取连接对象,请validation连接可用性。

希望这些信息有助于……

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

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

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

使用

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

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

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

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

以下是一些解决方案:

  • 更改“bind-address”属性

取消注释“bind-address”属性或将其更改为以下IP之一:

绑定地址=“127.0.0.1”

要么

绑定地址=“0.0.0.0”

  • 评论“跳过网络”

如果MySQL配置文件中有“跳过网络”行,请在该行的开头添加“#”符号进行注释。

  • 更改“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的

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

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

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

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

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

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

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

您将要通过使其看起来像这样注释掉绑定地址行:

 #bind-address = 127.0.0.1 

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

 sudo /etc/init.d/mysql restart