JDBC学习之道:JDBC中的Communications link failure due to underlying exception错误的解决办法

问题描述:使用JDBC连接Mysql数据库时,出现“Connection reset”错误,抛出如下异常:

Connection couldn't be established to jdbc:mysql://***/***?user=***&password=********
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception: 
** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Connection reset

STACKTRACE:java.net.SocketException: Connection reset
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:1910)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
at com.mysql.jdbc.Connection.configureClientCharacterSet(Connection.java:2436)
at com.mysql.jdbc.Connection.initializePropsFromServer(Connection.java:3913)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2683)
at com.mysql.jdbc.Connection.<init>(Connection.java:1531)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)

……** END NESTED EXCEPTION **

Last packet sent to the server was 203 ms ago.

STACKTRACE:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION **  java.net.SocketException
MESSAGE: Connection reset

STACKTRACE:

java.net.SocketException: Connection reset
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:1910)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
at com.mysql.jdbc.Connection.configureClientCharacterSet(Connection.java:2436)
at com.mysql.jdbc.Connection.initializePropsFromServer(Connection.java:3913)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2683)
at com.mysql.jdbc.Connection.<init>(Connection.java:1531)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
……

** END NESTED EXCEPTION **

问题分析:这个错误是Java程序没有连接上Mysql,导致无法进行任何与数据库相关的操作。这个错误的本质是一个网络的问题。

问题解决:首先,需要分别排查以下情况:
(1)MySql服务器是否支持TCP/IP连接;
(2)服务器端以及运行Java程序的客户端是否启用了防火墙;
(3)JDBC的驱动是否正确合适;
(4)是否启用了IPv6?如果现在使用的IPv6,那么换成IPv4再试试看;

如果上述情况都排除之后,还是出现如上的异常错误,那么很有可能是你电脑所处的网络存在问题,你可以尝试一下换个地方上网运行这个包含JDBC的Java程序,或者换个时间再次运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`com.mysql.jdbc.CommunicationsException`是MySQL JDBC驱动程序的一个异常,它表示在尝试连接到MySQL数据库时出现通信故障。这个异常通常是由于以下原因之一引起的: 1. 数据库服务器已关闭或未启动。 2. 数据库服务器上的端口号不正确。 3. 防火墙或其他网络设备阻止了连接。 4. 数据库服务器上的连接数已达到最大值。 要解决这个问题,可以尝试以下几个步骤: 1. 确保MySQL服务器正在运行,并且端口号正确。 2. 检查防火墙或其他网络设备是否阻止了连接。 3. 检查MySQL服务器的日志文件以获取更多信息。 4. 如果连接数已达到最大值,请增加MySQL服务器上的最大连接数。 以下是一个示例代码,可以用来连接MySQL数据库并捕获`com.mysql.jdbc.CommunicationsException`异常: ```java import java.sql.*; public class Example { public static void main(String[] args) { try { // 连接到MySQL数据库 String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "mypassword"; Connection conn = DriverManager.getConnection(url, user, password); // 执行SQL查询 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); // 处理查询结果 while (rs.next()) { System.out.println(rs.getString("column1")); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { // 捕获CommunicationsException异常 if (e instanceof CommunicationsException) { System.out.println("通信故障:" + e.getMessage()); } else { e.printStackTrace(); } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值