注:由于我在网上搜了很久,并没有我这种情况的解决方法,所以我这种解决方法可能有点投机取巧,大概率帮不上忙。如果你已经尝试过更改jar包版本;将mysql回收空闲连接的时间变长;重启电脑;手动打开数据库等方法,还是不能解决问题,那可以看一下本文。
下载jar包的网站:Central Repository: mysql/mysql-connector-java
一、问题描述
今天刚开始学JDBC,连接数据库的时候怎么也连不上,报错内容如下:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:F:\idea\download\IntelliJ IDEA Community Edition 2021.3.3\lib\idea_rt.jar=61218:F:\idea\download\IntelliJ IDEA Community Edition 2021.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;F:\idea\test\out\production\test_demo;F:\idea\test\lib\mysql-connector-java-8.0.16.jar" com.itheima.jdbc.JDBCDemo
111
Exception in thread "main" com.mysql.cj.jdbc.exceptions.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 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
at com.mysql.cj.jdbc.exceptions.
我的代码是这样的:
package com.itheima.jdbc;
import com.sun.javaws.IconUtil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/test"; //固定写法
String username="root";
String password="****"; //我的密码这个字符串就不展示了哈
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql语句
String sql="UPDATE db1 SET d_salary=1000 WHERE d_id=2";
//4.获取执行sql的对象Statement
Statement stmt = conn.createStatement(); //使用createStatement方法获取对象
//5.执行sql
int count = stmt.executeUpdate(sql); //受影响的行数
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
}
}
我翻阅了无数个解决方案,有说jar包版本不匹配的,我用的8.0.16版本的jar包,应该不是这里的问题(其实是我不太清楚在哪儿查看MySQL的版本,不过确实不是这里的问题);也有说是因为MySQL数据库没有启动的原因,需要手动启动一下。不过虽然都有帮到很多人,可我无奈不是他们中的一员。
二、解决方法
我突然想起来之前实训的时候做过项目,里面也有这部分内容,我就想着依葫芦画瓢看看是哪儿有问题。最终发现是把这里:
//2.获取连接
String url="jdbc:mysql://localhost:3306/test"; //固定写法
改为:
String url="jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&rewriteBatchedStatements=true"
这样就可以了。其中test是我的数据库名称,后面的参数说实话我也只懂七七八八,至于为什么要加这些参数,我也确实不知道,有明白的大佬还请教我一下。
补充:
修改后的url中“?”后面的useSSL是一种比较安全的链接方式,但是它需要比较复杂的配置,并且使用之后性能会降低一些,如果不设为false的话会报红字。而后面其他的是一些参数,用“&”隔开,具体啥意思目前还不太明白。