Когда драйвер Informix JDBC присутствует в моем пути к классам, он, похоже, перехватывает и отклоняет все строки подключения, прежде чем соответствующий драйвер получит шанс.Почему драйвер Informix JDBC обрабатывает несвязанные строки подключения?
Например, полностью нонсенс строка соединения, как jdbc:ghmghmghm
приведет к следующей трассировки стека:
java.sql.SQLException: Invalid sub-protocol Invalid sub-protocol: 'ghmghmghm'
at com.informix.util.IfxErrMsg.getLocSQLException(IfxErrMsg.java:493)
at com.informix.jdbc.IfxDriver.checkURL(IfxDriver.java:560)
at com.informix.jdbc.IfxDriver.connect(IfxDriver.java:208)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
Мое понимание, что хорошо вели себя драйверы JDBC ограничивают себя соединения строк, которые начинаются с их волшебной приставкой. Является ли драйвер Informix сломанным, или у меня есть необоснованные ожидания?
Update
Если удалить только драйвера Informix, но оставить все другие водители на месте, исключение переворачивается на гораздо более здравомыслящий
java.sql.SQLException: No suitable driver found for jdbc:ghmghmghm
at java.sql.DriverManager.getConnection(DriverManager.java:596)
at java.sql.DriverManager.getConnection(DriverManager.java:187)
Кроме того, существует конкретная допустимая строка подключения jdbc:sybase:Tds:leeta:5001/leeta_ase1
, который будет работать, если драйвер Informix будет удален, но будет поврежден (Informix недопустимая трассировка стека подпротоков), если Informix присутствует.
Мой вывод заключается в том, что Informix не отвергая полностью строк подключения несовпадающих правильно, и что Informix получает первую трещину в строках подключения Sybase (но не любой другой тип строки подключения я пробовал ...)
Мой Linux JDK является
java version "1.7.0_91"
OpenJDK Runtime Environment (IcedTea 2.6.3) (7u91-2.6.3-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.91-b01, mixed mode)
, но я видел плохие строки подключения приводит к трассировке Infx на официальном Java 8 на Windows, а также. Никогда еще не видел, чтобы Sybase перехватывала Windows, но, возможно, это проблема упорядочения классов.
Update 2
Я не могу Репрографический мое утверждение, что полностью действительные строки соединения были перехвачены и отвергнуты Informix. Я, должно быть, стараюсь делать тонкие строки, смотря на стек Informix, удаляя драйвер Informix в ответ, а затем рассматривая стек из правильного драйвера, чтобы выиграть (поскольку это позволило быстро восстановить строку соединения).
Я вижу несколько способов улучшить положение вещей:
- прекратить использование
DriverManager
всякий раз, когда класс драйвера известно (экземпляр драйвера непосредственно и вызватьgetConnection()
на нем) - Написать замену
DriverManager.getConnection()
, что по крайней мере сообщает все стеки отказов черезThrowable.addSuppressed()
- Обезьяна с классом классов Java, чтобы попытаться сделать Informix (и другие плохие актеры) появляться позже в списке драйверов (за @jonathan-leffler)
- Использование
DriverManager.(de)registerDriver()
для перемещения плохих актеров (как статический список или динамически во время выполнения испытания) в конце списка драйвера
Спасибо за все отзывы!
Какие еще драйверы JDBC находятся на пути к вашему классу? Пробовали ли вы распечатать содержимое системной опоры 'jdbc.drivers'? –
Можете ли вы позволить себе, чтобы драйвер Informix был последним в вашем списке? Можете ли вы убедиться, что это последнее? Будет ли это достаточным временным решением? –
Вы также протестировали это с помощью реальных строк соединения? Поскольку потенциальная причина сбоя 'jdbc: ghmghmghm' может быть проблемой синтаксического анализа, поскольку JDBC указывает, что url должен быть' jdbc:: <конкретная часть драйвера> 'и' jdbc: ghmghmghm' не выполняет это требование;) –