原文地址: 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](/uploads/projects/duoli@mysql/e4e78be44db5a02db89471eab8329c62.png)
@BalusC解答截图
具体报错–MySQL服务没启动同样报此错
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:526)at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981)at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:628)at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014)at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2255)at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286)at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085)at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:526)at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)at org.mybatis.generator.internal.db.ConnectionFactory.getConnection(ConnectionFactory.java:68)at org.mybatis.generator.config.Context.getConnection(Context.java:526)at org.mybatis.generator.config.Context.introspectTables(Context.java:436)at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:222)at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:133)at GeneratorSqlmap.generator(GeneratorSqlmap.java:27)at GeneratorSqlmap.main(GeneratorSqlmap.java:33)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2957)at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560)... 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](/uploads/projects/duoli@mysql/b6be89232e9398e9af53a2d8cc41cfc1.png)
Shadowsocks
我是栽在最后一条Proxy 想到了Firewall 却忘记他了 程序员翻个墙看看外面的世界 这是一件很正常的事 个人感觉Google甩Baidu一个地球到月球的距离 我就是由于开着小飞机(Shadowsocks) 嫌网速卡 切换到全局模式 然后就让我郁闷了3天。
改成自动模式 解决问题..
