我认为这是一个错误。 我正在使用最新的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();
}
以下是例外:
显示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) 在org.apache.commons.dbcp2.DelegatingPreparedStatement.setLong(DelegatingPreparedStatement.java:127) 在com.mypackage.MyClass $ MyThread.run(MyClass.java:117)
如果我只启动一个线程,它就可以工作。
没有apache dbcp2库也会发生异常。
我疯了!
答案 0 :(得分: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的组合用作驱动程序逐行传输结果集的信号。在此之后,将逐行检索使用该语句创建的任何结果集。