Java исключение при подключении к MySQL - PullRequest
0 голосов
/ 12 февраля 2019

решено Последняя версия драйвера JDBC MySQL, очевидно, пытается создать SSL-соединение.Приложение, которое РАБОТАЛО, НЕ определяло значения javax.net.ssl.keystore (и других), поэтому (я полагаю) оно возвращается к соединению без SSL.Приложение, которое СБОЙ определило все параметры хранилища ключей / сертификата, а затем попытка подключения потерпела неудачу - все еще не уверен точно, почему, если кто-то может просветить, был бы признателен.Выданное исключение также может быть более информативным.

В любом случае добавление «& 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 является частным IP-адресом AWS для этого сервера.)

Имеют 2 разные утилиты - отдельные «основные» подпрограммы, но все в одном и том же файле JAR.Первый работает отлично, второй прерывается со стеком, вставленным ниже.Это согласуется с десятками испытаний с небольшими вариациями.

В обеих основных подпрограммах используется метод connectToDB, показанный в трассировке стека.Инструментировал это для регистрации всех параметров и имени класса драйвера в обоих случаях и подтвердил, что они идентичны.

Уже пробовал / проверял:

  • Несколько запросов Google одного и того жеошибка
  • MySql работает и работает (подключиться через другое окно терминала без проблем),
  • Тот же JAR-файл, используемый со всем локальным кодом
  • Путь к классу идентичен
  • Работает под тем же пользователем Linux, используя того же пользователя / пароль MySQL
  • Проверьте указанный выше IP-адрес (172.31.10.222)
  • Также изменил IP-адрес на «localhost», 127.0.0.1, исимволическое имя из / etc / hosts
  • Добавлен -Xmx2G, чтобы убедиться, что проблема OOM не возникает

Это 2 разных метода 'main', но они не делают больше, чемзагрузить некоторые свойства (из тех же файлов свойств), прежде чем пытаться подключиться к БД.Затем они выполняют ту же процедуру 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: ...', как указано выше.Возникает исключение при выполнении 2-й строки выше.

Начиная с исходного поста, введите код для запуска 'netstat -ln' непосредственно перед этими строками и опубликуйте результат в журнале.Это показывает активный слушатель для порта 3306.

1 Ответ

0 голосов
/ 12 февраля 2019

Было бы здорово, если бы вы могли опубликовать метод connectToDB ().

Согласно этому предложению «Первое работает отлично, второе прерывается со стеком, вставленным ниже.», Вы, должно быть, закрылисоединение БД в первом вызове connectToDB ().

Так, чтобы второй вызов прервался, поскольку соединение с БД было прервано первым вызовом.

Хороший способ настройки - использовать внедрение зависимостей для объекта базы данных.

Надеюсь, что этопомогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...