已解决 最新版本的MySQL JDBC驱动程序显然尝试创建SSL连接。经过努力的应用程序未定义javax.net.ssl.keystore(及其他)值,因此(我假设)它恢复为非SSL连接。 FAILED确实定义了所有密钥库/证书参数的应用程序,然后连接尝试失败-仍然不确定确切的原因(如果有人可以启发您)。抛出的异常也可能会提供更多信息。
无论如何,将“&useSSL = false&allowPublicKeyRetrieval = true”添加到连接参数对两个应用程序均适用。 (尽管对于任何生产应用程序来说都不是一个很好的设置,但可以用于此POC!)
=============原始发布遵循=========
这让我难过了几天! AWS服务器(86_64),Fedora 29,Java 8(1.8.0_201-b09),MySQL-已全部升级到最新版本。 MySQL在同一服务器上运行。驱动程序:com.mysql.cj.jdbc.Driver
连接参数:jdbc:mysql://172.31.10.222:3306?user = xxxx&password = xxxx。 (IP是此服务器的AWS专用IP。)
具有2个不同的实用程序-单独的“主”例程,但都位于同一JAR文件中。第一个完美工作,第二个异常中止,下面粘贴了堆栈。这与数十项试验的细微变化是一致的。
不同的主例程都使用堆栈跟踪中显示的'connectToDB'方法。检测这两种情况下的日志以记录所有参数和驱动程序的类名,并验证它们是否相同。
已尝试/验证:
这是2个不同的“主要”方法,但是在尝试连接到数据库之前,除了加载一些属性(从相同的属性文件)外,所做的工作不多。然后他们执行相同的connectToDB例程。
上下文中的内容必须有所不同!希望这里的人至少可以提供一些提示,以帮助您了解那里的情况!
谢谢
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
at spc.tools.spcConnection.connectToDB(spcConnection.java:692)
at spc.tools.spcConnection.connectToLocalDB(spcConnection.java:1418)
at spc.tools.spcConnection.loadAllConnectionsOK(spcConnection.java:1112)
at spc.tools.spcConnection.initOneTime(spcConnection.java:1012)
at spc.tools.spcConnection.init(spcConnection.java:194)
at spc.ops.spcServerBase.environmentOK(spcServerBase.java:367)
at spc.ops.spcServerBase.environmentOK(spcServerBase.java:342)
at spc.run.daemon.spcDaemon.main(spcDaemon.java:1082)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:351)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.negotiateSSLConnection(NativeAuthenticationProvider.java:777)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.proceedHandshakeWithPluggableAuthentication(NativeAuthenticationProvider.java:486)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:202)
at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1442)
at com.mysql.cj.NativeSession.connect(NativeSession.java:165)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
... 11 more
Caused by: java.net.SocketException: Broken pipe (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:879)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:850)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:720)
at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:1144)
at sun.security.ssl.ClientHandshaker.sendChangeCipherAndFinish(ClientHandshaker.java:1280)
at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1190)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:369)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:315)
================================================ =======新信息=====
这是connectToDB方法的关键行(下面的评论):
Driver dvr = (Driver)Class.forName(info.sDBDriver).newInstance();
if(dvr!=null) conn = dvr.connect(accessString(), null);
验证了预期的驱动程序,并且accessString()返回'jdbc:mysql:...'字符串,如上所述。执行上面的第二行会引发异常。
自原始帖子以来,请在这些行之前添加代码以立即运行“ netstat -ln”,并将结果发布至日志。这显示了端口3306的活动侦听器。
答案 0 :(得分:0)
如果可以发布connectToDB()方法,那就太好了。
根据这句话“第一个完美运行,第二个异常中止并粘贴下面的堆栈。”,您必须在第一个connectToDB()调用中关闭了数据库连接。
因此,由于数据库连接被第一次调用终止,因此第二次调用中断了。
设置的好方法是对数据库对象使用依赖注入。
希望这会有所帮助!