无法使用Java JDBC连接到MySQL数据库

问题描述 投票:1回答:1

我创建了一个简单的类来测试与Mysql Workbench创建的与本地数据库的通信。 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(未知源)在java.sql.DriverManager.getConnection(未知源),位于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(未知源)在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 mysql jdbc workbench
1个回答
0
投票

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

但是,您可以通过在MySQL连接URL中将FALSE设置为“ useSSL”来忽略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);
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.