SSLSocket дуплексное закрытие не удалось исключение java.net.SocketException: Сокет закрыт при попытке подключиться к DB2 по протоколу TLS

#java #ssl #jdbc #db2

Вопрос:

Я пытаюсь понять, почему возникает эта ошибка:

 javax.net.ssl|WARNING|01|main|2021-07-04 12:08:30.668 CEST|SSLSocketImpl.java:497|SSLSocket duplex close failed (
"throwable" : {
  java.net.SocketException: Socket is closed
        at java.base/java.net.Socket.shutdownInput(Socket.java:1538)
        at java.base/sun.security.ssl.BaseSSLSocketImpl.shutdownInput(BaseSSLSocketImpl.java:216)
        at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:751)
        at java.base/sun.security.ssl.SSLSocketImpl.bruteForceCloseInput(SSLSocketImpl.java:701)
        at java.base/sun.security.ssl.SSLSocketImpl.duplexCloseOutput(SSLSocketImpl.java:562)
        at java.base/sun.security.ssl.SSLSocketImpl.close(SSLSocketImpl.java:486)
        at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.close(SSLSocketImpl.java:1034)
        at com.ibm.db2.jcc.t4.a0.j(a0.java:343)
        at com.ibm.db2.jcc.t4.b.freeTransport_(b.java:5523)
        at com.ibm.db2.jcc.t4.a.close_(a.java:455)
        at com.ibm.db2.jcc.am.Agent.close(Agent.java:345)
        at com.ibm.db2.jcc.t4.b.b(b.java:965)
        at com.ibm.db2.jcc.t4.b.a(b.java:804)
        at com.ibm.db2.jcc.t4.b.a(b.java:441)
        at com.ibm.db2.jcc.t4.b.a(b.java:414)
        at com.ibm.db2.jcc.t4.b.<init>(b.java:352)
        at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:233)
        at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:200)
        at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:182)
        at com.example.MainApplication.main(MainApplication.java:36)}

)
javax.net.ssl|ALL|01|main|2021-07-04 12:08:30.668 CEST|SSLSocketImpl.java:1217|Closing output stream
Exception in sql: com.ibm.db2.jcc.am.SqlNonTransientConnectionException
DB2 SQL Error: SQLCODE=-20157, SQLSTATE=08004, SQLERRMC=WEBADMIN;QUIESCE DATABASE;;, DRIVER=4.25.13
com.ibm.db2.jcc.am.SqlNonTransientConnectionException: DB2 SQL Error: SQLCODE=-20157, SQLSTATE=08004
 

Исключение возникает, когда я вызываю метод getConnection() в DriverManager:

 connection = DriverManager.getConnection(DB_URL, properties);
 

Я использую Java 11.0.11 от Oracle (не OpenJDK).

Ответ №1:

Поговорите со своей командой администратора базы данных или с тем, кто управляет базой данных — вы получаете это исключение, потому что кто-то (или какая-то работа) перевел базу данных в определенное состояние, которое используется для обслуживания.

Обычно это временная ситуация, и базу данных (или экземпляр Db2) необходимо вернуть в нормальный режим с помощью действия без запроса, когда операция обслуживания завершена. После действия unquiesce ваше соединение должно завершиться в обычном режиме.

Код SQLCODE (-20157) и SQLERRMC ( SQLERRMC=ВЕБ-АДМИНИСТРАТОР;БАЗА ДАННЫХ QUIESCE;), указанные в сообщении, указывают причину этого исключения.

Найдите SQL20157N в документах, чтобы получить подробное объяснение.

Комментарии:

1. @zilberman, пожалуйста, отметьте ответ как принятый