设置预准备语句参数时出现NullPointerException

时间:2015-01-22 21:10:39

标签: java mysql multithreading jdbc

我认为这是一个错误。 我正在使用最新的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库也会发生异常。

我疯了!

1 个答案:

答案 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的组合用作驱动程序逐行传输结果集的信号。在此之后,将逐行检索使用该语句创建的任何结果集。