原文地址: http://binux.cn/2017/03/02/Mac-MySQL-Error/

“这篇文章将讲一个困扰了我3天的问题 Java连接不上MySQL”

前言

上一篇讲的Mac上MySQL就突然没用了 但是Navicat、IDEA都可以连接上MySQL 使用Java就是连接不上  重装也没有用

具体情况是这样的

  • 第一天晚上在写订单模块 代码写完了 准备测试时 突然整个控制台狂打印错误 具体的错误就是下面的错误 当时就想着反正就order模块报错 明天再改吧 就回宿舍了
  • 第二天早上过来 我启动其他服务 发现全部都报错 Google了一上午 重装MySQL 依然没解决 下午不甘的去上课
  • 第二天晚上继续找错 试遍了各种情况 打算在虚拟机装MySQL 直接用虚拟机的 但是 依然报错 但是我发现我把网线一拔就可以正常使用 哎 谁能体会我现在的心情 再次不甘的回宿舍了
  • 第三天早上 带着万分的无奈 继续找错 8点找到11点半 还是找不到啊
  • 第三天下午我终于找到了 还是得感谢Google 感谢www.stackoverflow.com上的@BalusC

下面我会讲一下这个问题的原因 不限于我出现的这个问题 帮大家分析下这个问题 希望大家不要出现我这种问题了 为什么我老是碰到这种蛋疼问题  浪费时间还让人心烦  (3天时间干什么不好啊)


正文

@BalusC解答截图 再次感谢

# [转 ]解决Java程序连接不上MySQL 但是Navicat可以连接的问题! - 图1
@BalusC解答截图

具体报错–MySQL服务没启动同样报此错

  1. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
  2. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
  3. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  4. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
  5. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  6. at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
  7. at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
  8. at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981)
  9. at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:628)
  10. at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014)
  11. at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2255)
  12. at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286)
  13. at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085)
  14. at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
  15. at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
  16. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  17. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
  18. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  19. at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
  20. at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
  21. at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
  22. at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
  23. at org.mybatis.generator.internal.db.ConnectionFactory.getConnection(ConnectionFactory.java:68)
  24. at org.mybatis.generator.config.Context.getConnection(Context.java:526)
  25. at org.mybatis.generator.config.Context.introspectTables(Context.java:436)
  26. at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:222)
  27. at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:133)
  28. at GeneratorSqlmap.generator(GeneratorSqlmap.java:27)
  29. at GeneratorSqlmap.main(GeneratorSqlmap.java:33)
  30. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  31. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  32. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  33. at java.lang.reflect.Method.invoke(Method.java:606)
  34. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
  35. Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
  36. at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2957)
  37. at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560)
  38. ... 25 more

分析

报错问题:

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
最后一个发送成功的数据包在0秒前 没有收到任何来自服务器的数据包。
简单来说就是连不上MySQL服务器了

检查MySQL连接是否有错

这时候你就得检查下你的msyql连接url有没有写错了

driverconnectionURL="jdbc:mysql://**IP**:**3306**/**库名**"
userpassword="**密码**"

ip 端口 库名 仔细检查下

如果到这还没有解决问题 那么继续往下看

检查Hosts文件

查看jdbc中的IP是否在hosts文件中有解析

检查MySQL配置文件

查看是否绑定ip地址
如果有这行 注释bind-address=xxx.xxx.xxx.xxx

检查MySQL运行在哪个端口

mysql> show global variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.10 sec)

检查MySQL服务是否真正启动

telnet  Ip  3306

检查MySQL是否不接受远程连接

SELECT USER,HOST FROM user;
//正确
+-----------+-----------+
| USER      | HOST      |
+-----------+-----------+
| root      | %         |
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+

如果没有授权的话
mysql> grant all privileges on  .  to root@’%’ identified by ‘我是密码‘;

检查MySQL是否已经用完了所有连接

重启MySQL 出现运行程序 如果不报错就是此问题

检查有没有什么东西在阻止Java程序和MySQL连接

比如关闭防火墙  或者设置防火墙规则
比如有没有开什么代理
比如拔网线 再连接MySQL试试


总结

# [转 ]解决Java程序连接不上MySQL 但是Navicat可以连接的问题! - 图2
Shadowsocks
我是栽在最后一条Proxy 想到了Firewall 却忘记他了 程序员翻个墙看看外面的世界 这是一件很正常的事 个人感觉Google甩Baidu一个地球到月球的距离 我就是由于开着小飞机(Shadowsocks) 嫌网速卡 切换到全局模式 然后就让我郁闷了3天。
改成自动模式 解决问题..