我认为这是一个错误。 我正在使用最新的 MySQL JDBC 库。 我有多个线程。每个线程执行一个查询,并为每一行添加一个批处理到准备好的语句中。
有时指令“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();
}
这是一个异常(exception):
java.lang.NullPointerException at com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3124) at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3729) at com.mysql.jdbc.PreparedStatement.setLong(PreparedStatement.java:3751) at org.apache.commons.dbcp2.DelegatingPreparedStatement.setLong(DelegatingPreparedStatement.java:127) at org.apache.commons.dbcp2.DelegatingPreparedStatement.setLong(DelegatingPreparedStatement.java:127) at com.mypackage.MyClass$MyThread.run(MyClass.java:117)
如果我只启动一个线程,它就可以工作。
没有 apache dbcp2 库也会发生该异常。
我要疯了!
最佳答案
我解决了在创建结果集之前删除这些代码行的问题
Statement stmt = Database.getDatabase().createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
来自 MySQL 文档 here .
The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this, any result sets created with the statement will be retrieved row-by-row.
关于java - 设置准备好的语句参数时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28098740/