【问题标题】:Can't connect to MySQL Database with Java JDBC无法使用 Java JDBC 连接到 MySQL 数据库
【发布时间】:2018-11-30 16:24:58
【问题描述】:

我创建了一个简单的类来测试与我使用 Mysql Workbench 创建的 localhost 数据库的通信。 Mysql 服务器正在运行。 JDBC 驱动程序已添加到我的项目的 Classpath 中。

public class Database
{
    public static void main(String[] args)
            throws SQLException, ClassNotFoundException
    {
        Connection connection = null;
        String serverName = "localhost:3306";
        String databaseName = "detector_tests";
        String url = "jdbc:mysql://" + serverName + "/" + databaseName
                + "?useSSL=TRUE";

        String username = "simon";
        String password = "password123";
        connection = DriverManager.getConnection(url, username, password);
    }
}

当我运行程序时,我得到以下异常:

线程“main”中的异常 com.mysql.cj.jdbc.exceptions.CommunicationsException:通信 链接失败

最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。在 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:172) 在 com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) 在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) 在 com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) 在 com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) 在 com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) 在 java.sql.DriverManager.getConnection(Unknown Source) 在 java.sql.DriverManager.getConnection(Unknown Source) 在 Database.main(Database.java:17) 原因: com.mysql.cj.exceptions.CJCommunicationsException:通信链接 失败

最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知 来源)在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 来源)在 java.lang.reflect.Constructor.newInstance(未知来源) 在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:59) 在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:103) 在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:149) 在 com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:165) 在 com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:355) 在 com.mysql.cj.protocol.a.NativeAuthenticationProvider.negotiateSSLConnection(NativeAuthenticationProvider.java:789) 在 com.mysql.cj.protocol.a.NativeAuthenticationProvider.proceedHandshakeWithPluggableAuthentication(NativeAuthenticationProvider.java:499) 在 com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:217) 在 com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1411) 在 com.mysql.cj.NativeSession.connect(NativeSession.java:165) 在 com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:982) 在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:852) ... 6 更多原因:javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException:路径不链接 与任何信任锚在 sun.security.ssl.Alerts.getSSLException(未知来源)在 sun.security.ssl.SSLSocketImpl.fatal(未知来源)在 sun.security.ssl.Handshaker.fatalSE(未知来源)在 sun.security.ssl.Handshaker.fatalSE(未知来源)在 sun.security.ssl.ClientHandshaker.serverCertificate(未知来源) 在 sun.security.ssl.ClientHandshaker.processMessage(未知来源) 在 sun.security.ssl.Handshaker.processLoop(未知来源) sun.security.ssl.Handshaker.process_record(未知来源)在 sun.security.ssl.SSLSocketImpl.readRecord(未知来源)在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(未知来源) 在 sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) at sun.security.ssl.SSLSocketImpl.startHandshake(未知来源)在 com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:213) 在 com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:206) 在 com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:99) 在 com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:350) ... 13 更多原因:java.security.cert.CertificateException: java.security.cert.CertPathValidatorException:路径不链接 与任何信任锚在 com.mysql.cj.protocol.ExportControlled$X509TrustManagerWrapper.checkServerTrusted(ExportControlled.java:280) 在 sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(未知 来源)... 25 更多 原因: java.security.cert.CertPathValidatorException:路径不链接 与任何信任锚在 sun.security.provider.certpath.PKIXCertPathValidator.validate(未知 来源)在 sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(未知 来源)在 java.security.cert.CertPathValidator.validate(未知 来源)在 com.mysql.cj.protocol.ExportControlled$X509TrustManagerWrapper.checkServerTrusted(ExportControlled.java:273) ... 26 更多

看来我需要添加某种证书或其他东西。我不确定,因为我对数据库很陌生。有相同经历的人或者解决办法吗?如果您需要更多信息,我很乐意编辑帖子。

提前致谢!

【问题讨论】:

  • "java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: 路径未与任何信任锚链接"
  • 什么意思?我需要在我的 Windows 操作系统上配置 Eclipse、数据库或其他东西吗?
  • 你试过用谷歌搜索那个错误信息吗?我看到很多帖子和回复...
  • 是的,找不到任何有用的东西。

标签: java mysql jdbc workbench


【解决方案1】:

您似乎正在尝试将 mysql 数据库与证书一起连接。如果您通过 TLS 连接到 MySQL 实例,则需要有一个信任库来保存您的证书。请参阅this document 以创建 MySQL 连接以及 TLS 连接。

但是,您可以通过在 MySQL 连接 URL 中将“useSSL”设置为 FALSE 来忽略 TLS 验证。您的代码将如下所示。

public class Database
{
    public static void main(String[] args)
            throws SQLException, ClassNotFoundException
    {
        Connection connection = null;
        String serverName = "localhost:3306";
        String databaseName = "detector_tests";
        String url = "jdbc:mysql://" + serverName + "/" + databaseName
                + "?useSSL=FALSE";

        String username = "simon";
        String password = "password123";
        connection = DriverManager.getConnection(url, username, password);
    }
}

希望这将是您问题的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多