com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链接失败

20 浏览
0 Comments

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链接失败

我正在处理让我的数据库与我的Java程序进行通信的问题。

有人能给我一个使用JDBC的快速且简单的示例程序吗?

我遇到了一个相当巨大的错误:

在主线程中的异常"main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信连接失败
    最后一个成功发送到服务器的数据包距现在0毫秒。驱动程序未收到服务器发送的任何数据包。
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
    at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:787)
    at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at SqlTest.main(SqlTest.java:22)
由于:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信连接失败
    最后一个成功发送到服务器的数据包距现在0毫秒。驱动程序未收到服务器发送的任何数据包。
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.MysqlIO.(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
    ... 12 more
由于:java.net.ConnectException: 连接被拒绝
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.(Socket.java:375)
    at java.net.Socket.(Socket.java:218)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.(MysqlIO.java:293)
    ... 13 more

测试文件的内容:

import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlTest {
    public static void main(String [] args) throws Exception {
        // Class.forName( "com.mysql.jdbc.Driver" ); // 在初始化中执行此操作
        // // 编辑jdbc url 
        Connection conn = DriverManager.getConnection( 
            "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
        // Statement st = conn.createStatement();
        // ResultSet rs = st.executeQuery( "select * from table" );
        System.out.println("连接成功?");
    }
}

0
0 Comments

(com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure)这个问题的出现的原因是数据库连接失败。解决方法是将连接URL中的"localhost"替换为实际的数据库服务器IP地址。

在某些情况下,需要将连接URL中的"localhost"替换为数据库服务器的IP地址,以便成功连接数据库。例如,原始连接代码如下:

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://localhost:3306/DBname", "root", "root");

而实际上,应该将"localhost"替换为数据库服务器的IP地址,如下所示:

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");

在最新的更新中(4/5/18),作者提到使用的是MySQL Workbench 6.3,他自己找到了解决方法。问题的原因是MySQL服务器没有运行或已停止。作者重新启动了服务器,问题得到解决。

这个解决方法是最佳的解决方案,因为它解决了数据库连接失败的问题。通过重新启动MySQL服务器,可以确保服务器正常运行,从而解决了连接问题。

需要注意的是,这个解决方法不能生成数据帧(dataframe)。它只解决了数据库连接问题,而不涉及数据帧的生成。

0
0 Comments

在使用Java连接MySQL数据库时,经常会遇到以下错误信息:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure,并且可能会附带以下错误信息:java.net.ConnectException: Connection refused。这个错误的出现可能有以下原因:

1. JDBC URL中的IP地址或主机名错误。

2. JDBC URL中的主机名无法被本地DNS服务器识别。

3. JDBC URL中的端口号缺失或错误。

4. 数据库服务器宕机。

5. 数据库服务器不接受TCP/IP连接。

6. 数据库服务器的连接已经用完。

7. Java与数据库之间的某个中间环节(如防火墙或代理)阻止了连接。

为了解决以上问题,可以按照以下建议进行操作:

1. 使用ping命令验证IP地址或主机名是否正确。

2. 刷新DNS缓存或者直接使用IP地址替代主机名。

3. 根据MySQL数据库的my.cnf文件验证配置信息。

4. 启动数据库服务器。

5. 验证是否在启动mysqld时没有使用--skip-networking选项。

6. 对数据库进行重启,并相应地修改代码,确保在finally中关闭连接。

7. 关闭防火墙,或者配置防火墙/代理以允许/转发指定的端口。

除此之外,还有一些其他的建议和讨论可以参考,例如在Servlet应用程序中连接JDBC数据库的最佳实践,以及在多线程系统中使用静态java.sql.Connection实例是否安全等。此外,还有一些特定情况下的解决方法,例如在连接池中使用长时间不活动的连接时,可能会出现"Communications Link Failure"的错误,可以通过设置验证查询来解决这个问题。

当出现com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure的错误时,可以根据以上原因和解决方法进行逐一排查和修复,以实现成功连接到MySQL数据库。

0
0 Comments

在我的情况下,解决方案是在连接字符串中添加预期的TLS协议,如下所示:

jdbc:mysql://localhost:3306/database_name?enabledTLSProtocols=TLSv1.2

为了测试/开发目的(不推荐用于生产环境),您还可以尝试:

jdbc:mysql://localhost:3306/database_name?useSSL=false&allowPublicKeyRetrieval=true

非常感谢!我一直在纠结到底出了什么问题。我可以使用MySQL Workbench连接,但无法通过Java代码和连接字符串连接到我认为是相同的RDS实例。

欢迎。很高兴我的答案能帮助您解决问题。

我也非常感谢您。我花了很多时间搜索,才找到您的答案。

这也解决了我的问题。谢谢!

请问有人能解释一下为什么启用TLS协议后它就开始工作了吗?:-)

对我来说,这是解决方案。我认为问题是我的Linux版本较旧,而我的数据库版本较新,因此它们管理着不同的最低要求TLS协议版本。

0