ExceptionInInitializerError для db2 - PullRequest
2 голосов
/ 24 мая 2011

У меня самая простая программа JDBC для чтения данных из экземпляра DB2 (или другого сконфигурированного). Когда я пытаюсь запустить его из Eclipse ИЛИ из командной строки, происходит сбой подключения, в результате чего возникает исключение SQL

 Class.forName(jdbcDriverClassName).newInstance();

Сбой class.forName, используя com.ibm.db2.jcc.DB2Driver. Я настроил Eclipse так, чтобы он указывал на тот же драйвер, который использует DBVisualizer (как в качестве загрузочной библиотеки, так и для проекта). Программа использует ту же строку подключения, что и DBVisualizer. DBVisualizer не имеет никаких проблем.

Выход с полным стеком (обратите внимание, что FQN для драйвера не является нулевым):

                   V-- !null driver name --V
Attempting to load com.ibm.db2.jcc.DB2Driver
ERROR:java.lang.ExceptionInInitializerError: null
java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at com.ibm.db2.jcc.DB2Driver.class$(DB2Driver.java:58)
at com.ibm.db2.jcc.DB2Driver.<clinit>(DB2Driver.java:61)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at com.onlineretailer.ecomm.dumporder.DumpOrder.main(DumpOrder.java:79)
Caused by: java.lang.NullPointerException
at com.ibm.db2.jcc.am.ib.i(ib.java:490)
at com.ibm.db2.jcc.am.ib.<clinit>(ib.java:420)
... 7 more

Я также попытался добавить .newInstance () в конец class.forName (), и он продолжает выполнять то же поведение.

Спасибо всем за ваше время и вклад!

Ответы [ 3 ]

4 голосов
/ 24 мая 2011
SQLException: No suitable driver found for jdbc:db2:...

Это исключение имеет только 2 возможных причины:

  1. Драйвер JDBC неизвестен с DriverManager.Т.е. драйвер JDBC не зарегистрировал себя должным образом DriverManager#registerDriver().

  2. URL-адрес JDBC неизвестен ни для одного из драйверов JDBC, зарегистрированных в DriverManager.Т.е. Driver#acceptsURL() не вернул true ни для одного из зарегистрированных драйверов.

Ваше имя класса драйвера JDBC в порядке.Ваш URL JDBC в порядке.

хорошо спроектированный Драйвер JDBC регистрируется с DriverManager в static {} блоке инициализатора, который выполняется при Class#forName().Однако более старые версии драйвера IBM DB2 JDBC регистрируются в конструкторе .Для тех сломанных драйверов вам также необходимо позвонить newInstance().

Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();

См. Также:


Обновление согласно обновлению вашего вопроса,newInstance() сделал трюк.Однако это приводит к новой проблеме:

Caused by: java.lang.NullPointerException
at com.ibm.db2.jcc.am.ib.i(ib.java:490)
at com.ibm.db2.jcc.am.ib.<clinit>(ib.java:420)

Оказывается, это еще одна ошибка в самом драйвере DB2 JDBC.Обновите его.

1 голос
/ 24 мая 2011

Вам также нужно загрузить драйвер в JVM, используя Class.forName() Вам необходимо загрузить следующий драйвер

com.ibm.db2.jcc.DB2Driver 

Вот как это выглядит полностью

String databaseURL = "jdbc:derby:net://localhost:1527/sample";
// Load DB2 Driver for JDBC class
Class.forName("com.ibm.db2.jcc.DB2Driver");
// Set user and password properties
Properties properties = new Properties();
properties.put("user", "APP");
properties.put("password", "APP");
properties.put("retreiveMessagesFromServerOnGetMessage", "true");
// Get a connection
Connection conn = DriverManager.getConnection(databaseURL, properties); 

1010 * Reference *

0 голосов
/ 24 мая 2011

«Нет подходящего драйвера» обычно означает, что URL-адрес соединения неверен для используемого вами JAR-файла.

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