У меня есть приложение 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, ИД пользователя и пароль), почему вызов никогда не возвращается с таймаутом? Могу ли я добавить здесь тайм-аут или исключение, которое я могу обработать в этом вызове? Пожалуйста, помогите мне.