com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链接失败
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("连接成功?"); } }
(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)。它只解决了数据库连接问题,而不涉及数据帧的生成。
在使用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数据库。
在我的情况下,解决方案是在连接字符串中添加预期的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协议版本。