2015-01-22 3 views
0

Я думаю, что это ошибка. Я использую последнюю библиотеку MySQL JDBC. У меня несколько потоков. Каждый поток выполняет запрос и для каждой строки добавляет пакет в подготовленный оператор.NullPointerException при настройке параметров подготовленных операторов

Иногда инструкция «stmt.setLong (i, aLong)» запускает исключение NullPointerException. stmt, i и aLong не являются нулевыми.

PreparedStatement stmt = db.prepareStatement("myinsert"); 
while (rs.next()) { 
    long aLong = rs.getLong(1); 
    ... 
    stmt.setLong(1,aLong); 
    stmt.addBatch(); 
} 

Вот исключение:

java.lang.NullPointerException на com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding (ConnectionImpl.java:3124) в com.mysql.jdbc.PreparedStatement .setInternal (PreparedStatement.java:3729) на com.mysql.jdbc.PreparedStatement.setLong (PreparedStatement.java:3751) на org.apache.commons.dbcp2.DelegatingPreparedStatement.setLong (DelegatingPreparedStatement.java:127) в орг .apache.commons.dbcp2.DelegatingPreparedStat ement.setLong (DelegatingPreparedStatement.java:127) в com.mypackage.MyClass $ MyThread.run (MyClass.java:117)

Если я запустить только одну нить, она работает.

Исключение также происходит без библиотеки apache dbcp2.

Я схожу с ума!

+0

Является ли 'PreparedStatement', к которому потоки добавляют партии, разделяемые несколькими потоками? – dasblinkenlight

+0

№. Каждый поток создает собственное PreparedStatement. Каждое PreparedStatement является вставкой в ​​одной таблице, но это разные объекты. – fran

+0

Я предполагаю, что то же самое относится к набору результатов 'rs' в вашем примере, правильно? – dasblinkenlight

ответ

0

Я решил проблему удаления этих строк кода до создания ResultSet

Statement stmt = Database.getDatabase().createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 

Из MySQL документации here.

Комбинация результирующего набора только для чтения, с размером выборки Integer.MIN_VALUE служит сигналом, который драйвер выводит наборы результатов последовательно. После этого любые результирующие наборы, созданные с помощью инструкции, будут загружаться по строкам.

+1

Если вы немного почитаете [связанную документацию] (http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html), вы увидите _ Существуют некоторые предостережения с таким подходом. ** ** вы должны прочитать все строки ** в результирующем наборе (или закрыть его) **, прежде чем вы сможете выдать какие-либо другие запросы ** в соединении, или будет выбрано исключение. «Однако я ожидал бы более чистого исключения, чем NPE. –

Смежные вопросы