“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_packet
“[max_allowed_packet] [4]”是MySQL配置文件中的一个变量,表示最大数据包大小,而不是最大数据包数。 所以它无助于解决这个错误。
- 改变tomcat的安全性
将TOMCAT6_SECURITY = yes更改为TOMCAT6_SECURITY = no
- 使用validationQuery属性
使用validationQuery =“select now()”来确保每个查询都有响应
- autoReconnect的
将此代码添加到您的连接字符串:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
您的MySQL服务器未运行。 如果您运行的是Windows,请在任务管理器的服务页面中检查相同内容。
如果您正在使用Amazon Ubuntu实例,则必须执行以下步骤:
- 检查亚马逊实例
- 检查实例的安全组
- 分配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