Java DriverManager.getConnection зависает при вызове с неправильными параметрами - PullRequest
2 голосов
/ 04 марта 2020

У меня есть приложение Java с несколькими одновременными потоками. В конкретной ситуации обнаруживается, что вызов java.sql.DriverManager.getConnection зависает и ждет бесконечно, что приводит к зависанию всей системы. Я подозреваю, что неправильно указал URL, где сервер ORACLE не прослушивает этот вызов, но есть другой прослушиватель БД, который не возвращается к вызову сокета. Это может быть причиной этого зависания. Когда я изменил URL-адрес на неправильное значение, например, jdbc:oracle:thin:@xx: 21050: БД, в которой не работает ни прослушиватель БД (oracle или не oracle), выдается getConnection вызов с java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection.

Существует ли какой-либо другой API, с помощью которого я могу проверить во время выполнения, работает ли на сервере URL 101 * прослушиватель сервера? Моя проблема с этим зависанием заключается в том, что у меня работает какой-то другой слушатель БД (не ORACLE), а мой getConnection зависает. Есть ли какое-нибудь лекарство или обходной путь? Дамп потока показывает мне следующее:

"AWT-EventQueue-0@3511" prio=6 tid=0x15 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
      at sun.nio.ch.SocketDispatcher.read0(SocketDispatcher.java:-1)
      at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
      at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
      at sun.nio.ch.IOUtil.read(IOUtil.java:197)
      at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
      - locked <0x459c> (a java.lang.Object)
      at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:144)
      at oracle.net.ns.NIOHeader.readHeaderBuffer(NIOHeader.java:82)
      at oracle.net.ns.NIOPacket.readNIOPacket(NIOPacket.java:252)
      at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:118)
      at oracle.net.ns.NSProtocol.connect(NSProtocol.java:317)
      at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1438)
      at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518)
      at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688)
      at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39)
      at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:691)
      at java.sql.DriverManager.getConnection(DriverManager.java:664)
      at java.sql.DriverManager.getConnection(DriverManager.java:247)

Я обнаружил похожую проблему, обсуждаемую как: Oracle JDB C DriverManager.getConnection () зависает Но мой вопрос, даже если Я предоставляю некоторые неправильные параметры (URL, ИД пользователя и пароль), почему вызов никогда не возвращается с таймаутом? Могу ли я добавить здесь тайм-аут или исключение, которое я могу обработать в этом вызове? Пожалуйста, помогите мне.

...