![](/img/trans.png)
[英]com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure?
[英]“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure” to remote database
我试图连接到我的远程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
有人可以帮我吗?
如果数据库连接长时间处于空闲状态,则会发生此com.mysql.jdbc.exceptions.jdbc4.CommunicationsException异常。 此idle连接在connection.isClosed()上返回true; 但如果我们尝试执行语句,那么它将触发此异常,因此我建议使用数据库池。
通常,当您不使用正确的端口号时会发生此错误。 可能是在这个数据库上工作的机器(client'db)有不同的端口号。 (例如:3307)。
去任务管理器==>服务==>服务并检查是否有其他版本的mysql。 如果他们使用3306将您的端口更改为3307。
你可以尝试替换mysql-connector-java-version.jar jar文件。 有些人将jar文件从5.1.10更新到5.1.14,然后就可以了。 祝你好运..
将您的驱动器版本更新为:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
双重检查以下内容:
希望这些信息有助于......
我通过从连接URL中删除端口号来解决它。
因此,而不是使用连接字符串:
jdbc:mysql://12x.xxx.xxx.xxx:1527/yourdbname
使用
jdbc:mysql://12x.xxx.xxx.xxx/yourdbname
此外,当我在我的代码中使用了错误的用户名或密码时,它会立即显示错误的验证。 这是否证明设置连接是没有问题的?
这可能是在当地完成的。 所以它与你的代码不工作的原因无关。
似乎有很多方法可以解决这个问题,所以你可以尝试多种方法; 人们根据自己的情况以不同的方式解决了这个环节的失败:
取消注释“bind-address”属性或将其更改为以下IP之一:
绑定地址=“127.0.0.1”
要么
绑定地址=“0.0.0.0”
如果MySQL配置文件中存在“跳过网络”行,请在该行的开头添加“#”符号进行注释。
将这些行添加到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服务器的用户名和密码。
“[max_allowed_packet] [4]”是MySQL配置文件中的变量,表示最大数据包大小,而不是最大数据包数。 所以它无助于解决这个错误。
将TOMCAT6_SECURITY = yes更改为TOMCAT6_SECURITY = no
使用validationQuery =“select now()”来确保每个查询都有响应
将此代码添加到您的连接字符串:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
您的MySQL服务器未运行。 如果您运行的是Windows,请在任务管理器的服务页面中检查相同内容。
如果您正在使用Amazon Ubuntu实例,则必须执行以下步骤:
请更新/etc/mysql/my.cnf文件中的mysql配置文件
默认情况下,MySQL仅允许来自localhost地址的连接。 配置文件通常位于/etc/mysql/my.cnf中
您将要通过使其看起来像这样注释掉绑定地址行:
#bind-address = 127.0.0.1
接下来,您将需要重新启动数据库服务器:
sudo /etc/init.d/mysql restart
我曾经遇到过这个问题并且经历了很多困难。 我在所有门户网站上做了所有单一事情并没有为我工作。 唯一对我有用的是将我的jar文件更新为当前的新版本。 早些时候我使用5.1.38,现在更新到8.0.15,只是我的程序工作得非常好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.