【发布时间】:2013-03-20 16:16:23
【问题描述】:
当我尝试将我的 java 程序连接到服务器时,我得到了这个异常:
CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
所以我找到了这些说明:
如果您收到 SQLException:连接被拒绝或连接超时 或 MySQL 特定的 CommunicationsException: Communications link 失败,则意味着数据库根本无法访问。这个可以 有以下一种或多种原因:
- JDBC URL 中的 IP 地址或主机名错误。
- 本地 DNS 服务器无法识别 JDBC URL 中的主机名。
- JDBC URL 中的端口号缺失或错误。
- 数据库服务器已关闭。
- 数据库服务器不接受 TCP/IP 连接。
- 数据库服务器已用完连接。
- Java 和 DB 之间的某些东西阻塞了连接,例如一种 防火墙或代理。
要解决其中一个问题,请遵循以下建议:
- 使用 ping 验证和测试它们。
- 刷新 DNS 或改用 JDBC URL 中的 IP 地址。
- 根据 MySQL DB 的 my.cnf 进行验证。
- 启动数据库。
- 验证 mysqld 是否在没有 --skip-networking 选项的情况下启动。
- 重新启动数据库并相应地修复您的代码以使其关闭 终于连接上了。
- 禁用防火墙和/或配置防火墙/代理以允许/转发 港口。
来自this answere。
我尝试了所有选项,但不确定如何使用“my.ini”配置文件验证端口号(选项 3)。另外,我发现 services.msc 列表中缺少“MySQL”的服务,但我确实发现使用了 3306 端口。它与问题有关吗? 'my.ini' 配置文件应该是什么样子? 我使用 MySQL Workbench 5.2.47。 (MySQL服务器版本为5.6)。
我的连接代码:
private MySQLConnectivity() {
try { Class.forName("com.mysql.jdbc.Driver"); Connect();
} catch (ClassNotFoundException e)
{ // TODO Auto-generated catch block e.printStackTrace(); }
}
public void Connect() { try { MySQLConnectivity.Conn = (Connection)DriverManager.getConnection(URL, USER, PASS);
} catch (SQLException e)
{ // TODO Auto-generated catch block e.printStackTrace();
} finally { }
【问题讨论】:
-
我的连接代码:private MySQLConnectivity() { try { Class.forName("com.mysql.jdbc.Driver");连接(); } catch (ClassNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } public void Connect() { try { MySQLConnectivity.Conn = (Connection)DriverManager.getConnection(URL, USER, PASS); } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } 最后 { }