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

时间:2018-06-21 10:55:47

标签: java mysql jdbc workbench

我创建了一个简单的类来测试通过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);
    }
}

运行程序时,出现以下异常:

  

线程“主”中的异常   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个

似乎我需要添加某种证书或其他东西。我不确定,因为我刚接触数据库。有相同经验或解决方案的人吗?如果您需要更多信息,我很乐意编辑该帖子。

谢谢!

1 个答案:

答案 0 :(得分:0)

似乎您正在尝试将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);
    }
}

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