无法使用java jdbc连接到mysql数据库

bcs8qyzn  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(471)

我用mysql workbench创建了一个简单的类来测试与localhost数据库的通信。mysql服务器正在运行。jdbc驱动程序被添加到我的项目的类路径中。

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(数据库)。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.certificateeexception:java.security.cert.certpathvalidatorexception:path未与位于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\u record(未知源)at sun.security.ssl.sslsocketimpl.readrecord(未知源)at sun.security.ssl.sslsocketimpl.performitialhandshake(未知源)at sun.security.ssl.sslsocketimpl.starthandshake(未知源)at sun.security.ssl.sslsocketimpl.starthandshake(未知源)com.mysql.cj.protocol.exportcontrolled.performtlshandshake(exportcontrolled。java:213)在com.mysql.cj.protocol.standardsocketfactory.performtlshatche(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:path未与com.mysql.cj.protocol.exportcontrolled$X509TrustManagerRapper.checkservertrusted(exportcontrolled)上的任何信任锚链接。java:280)位于sun.security.ssl.abstractTrustManagerRapper.checkservertrusted(未知来源)。。。25更多原因:java.security.cert.certpathvalidatorexception:path未与sun.security.provider.certpath.pkixcertpathvalidator.validate(未知源)上的任何信任锚点链接,该锚点位于sun.security.provider.certpath.pkixcertpathvalidator.enginevalidate(未知源)上的java.security.certpathvalidator.validate(未知源)位于com.mysql.cj.protocol.exportcontrolled$x509trustmanagerwrapper.checkservertrusted(exportcontrolled)。java:273) ... 26个以上
看来我需要加些证书什么的。我不确定,因为我对数据库很陌生。有没有人有相同的经验或解决方案?如果你需要更多的信息,我很乐意编辑这篇文章。
提前谢谢!

pcww981p

pcww981p1#

似乎您正在尝试连接mysql数据库和证书。如果您是通过tls连接到mysql示例,那么您需要有一个信任存储来保存您的证书。请参阅本文档以创建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);
    }
}

希望这能回答你的问题。

相关问题