链接MySql数据库报错


package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Main {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        //String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false";
        String url="jdbc:mysql://127.0.0.1:3306/db1";
        //String url=" jdbc:mysql://192.168.56.10:3306/gulimall_admin?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        String username="root";
        String password="321116";
        Connection conn= DriverManager.getConnection(url,username,password);
        String sql="update tb_user set password=465728 where id=1";
        Statement stmt=conn.createStatement();
        int count=stmt.executeUpdate(sql);
        System.out.println(count);
        stmt.close();
        conn.close();

    }
}

报错提示:


Exception in thread "main" com.mysql.cj.jdbc.exceptions.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.
    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
    at org.example.Main.main(Main.java:17)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: 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.
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
    at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
    at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:351)
    at com.mysql.cj.protocol.a.NativeAuthenticationProvider.negotiateSSLConnection(NativeAuthenticationProvider.java:777)
    at com.mysql.cj.protocol.a.NativeAuthenticationProvider.proceedHandshakeWithPluggableAuthentication(NativeAuthenticationProvider.java:486)
    at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:202)
    at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1442)
    at com.mysql.cj.NativeSession.connect(NativeSession.java:165)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
    ... 6 more
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
    at java.base/sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:172)
    at java.base/sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:103)
    at java.base/sun.security.ssl.TransportContext.kickstart(TransportContext.java:240)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:448)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)
    at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:315)
    at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:188)
    at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:99)
    at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:347)
    ... 13 more

指定时区serverTimezone=UTC

String url="jdbc:mysql://127.0.0.1:3306/db1";
->
 String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false"

该回答引用ChatGPT4与博主@晓码自在合作编写:

根据报错信息,这是一个连接 MySQL 数据库失败的错误。错误信息显示是 SSL 连接失败导致的。

解决方法如下:

  1. 在 MySQL 数据库中,检查 ssl-cert 和 ssl-key 配置项是否正确。这两个配置项指定了数据库使用的 SSL 证书,如果配置错误会导致 SSL 连接失败。
  2. 在连接字符串中添加 useSSL=false,禁用 SSL 连接。改写后的连接字符串为:
String url="jdbc:<mysql://127.0.0.1:3306/db1?useSSL=false";

  1. 检查 MySQL 服务端口号是否正确。默认 MySQL 服务端口是 3306,如果你修改过,请检查你的 MySQL 服务正在监听的端口,并在连接字符串中更新。
  2. 检查数据库用户名和密码是否输入正确。如果输入错误也会导致连接失败。
  3. 检查数据库地址是否可以访问。如果是远程数据库,请检查数据库网络配置,确认可以从你的本地访问。
  4. 你也可以尝试先启动 MySQL 的 CLI 客户端工具,看是否可以成功连接数据库。如果 CLI 客户端也连接失败,则确认是数据库端的配置问题,如果可以连接成功,则更有可能是你的 Java 代码配置出了问题。
  5. 可以在 IDE 中添加断点,debug 你的 Java 程序,观察程序连数据库的详细过程,这也可以帮助发现问题。