我创建了一个简单的类来测试通过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个
似乎我需要添加某种证书或其他东西。我不确定,因为我刚接触数据库。有相同经验或解决方案的人吗?如果您需要更多信息,我很乐意编辑该帖子。
谢谢!
答案 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);
}
}
希望这将是您问题的答案。