2014-09-09 2 views
0

У меня есть многопоточная программа, которая соединяется с базой данных оракула.JDBC Oracle Результат набора Null Pointer Exception

Первый поток выполняет «большой» запрос и загружает объекты в LinkedBlockingQueue. Есть около 200 000 объектов.

Вторая нить опросает этот список, и для каждого объекта он запускает 14 других запросов, обновляя параметры объекта. Затем я подключаюсь к другой базе данных, в последний раз получаю соответствующий объект для этого текущего объекта, создаю гибридный объект, содержащий эти два объекта, и отправляет его в третий поток.

Я использую один оператор и несколько наборов результатов для каждого из этих 14 запросов.

stat=predefinedobject.getConnection().createStatement(); 
    ResultSet rs = null; 
    ResultSet rs1 = null; 
    ResultSet rs2 = null; 
    ResultSet rs3 = null; 
      . 
      . 
    rs=stat.executeQuery(Query1); 
    while(rs.next()) { 
     object1.setParameter1(rs.getString(5)); 
    } 
    SqlUtils.closeResultSet(rs); 

    rs1=stat.executeQuery(Query2); 
    while(rs1.next()) { 
     object1.setParameter2(rs1.getString(5)); 
    } 
    SqlUtils.closeResultSet(rs1); 
      . 
      . 
      . 
    SqlUtils.closeResultSet(rs14); 
    SqlUtils.closeResultSet(stat); 

Я получаю исключение null-указателя через некоторое время.

java.lang.NullPointerException 
at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:876) 
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:825) 
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1049) 
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:845) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154) 
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1313) 
+0

Какой сервер и драйвер Oracle версии? –

+0

Я думаю, что мы используем Oracle 11g, не знаем о версии драйвера, хотя – user2133404

+0

Ошибка возникает внутри драйвера, что может указывать на ошибку в драйвере; или, может быть, ваш 'SqlUtils.closeResultSet' игнорирует исключения, которые могут быть релевантными, приводящие к несогласованному состоянию внутри драйвера (что все равно будет ошибкой в ​​драйвере). Я предлагаю вам 1) проверить версию драйвера и обновить до последней версии, 2) проверить, игнорирует ли ваш метод утилиты исключения и видит ли они какие-либо события. –

ответ

0

javadoc говорит - по умолчанию, только один объект ResultSet в себе объект может быть открыт одновременно. Поэтому, если чтение одного объекта ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован различными объектами Statement. Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet, если существует открытый.

Так можно попытаться создать новый отчет объект каждый раз, когда вы хотите, чтобы запрос к базе данных

+0

Тем не менее, я получаю такое же исключение Null Pointer. – user2133404

+0

'java.lang.NullPointerException \t на oracle.jdbc.driver.T4C8Oall.getNumRows (T4C8Oall.java:876) \t в oracle.jdbc.driver.T4CStatement.executeForDescribe (T4CStatement.java:825) \t на оракула. jdbc.driver.OracleStatement.executeMaybeDescribe (OracleStatement.java:1049) \t на oracle.jdbc.driver.T4CStatement.executeMaybeDescribe (T4CStatement.java:845) \t на oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java: 1154) \t at oracle.jdbc.driver.OracleStatement.executeQuery (OracleStatement.java: 1313) ' – user2133404

+0

покажите мне, пожалуйста, ваш запрос – SparkOn

1

Дважды проверьте ваши строки запроса SQL, это кажется вам сцепить запрос, но не хватает немного места в нем.

Например,

String sql="select"+MYCOULUM+" form MYTABLE" 

будет производить следующую строку

selectMYCOULUM form MYTABLE 

и выполнение такого запроса приведет эту ошибку для драйвера Oracle JDBC