java - 设置准备好的语句参数时出现 NullPointerException

标签 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();
}

这是一个异常(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/

相关文章:

c# - 刷新高速缓存时如何提供过时的数据?

multithreading - Sitecore 预定作业的优先级

c++ - 理解 std::thread 语义,工作函数作为类成员

JAVA "cannot be cast to java.lang.String"

java - 从 Netbeans 构建并运行 Java 应用程序

java - 如何增加 JScrollPane Pane 的大小?

mysql - 如何连接复合表

python - 多个 MySQL JOIN 和重复的单元格

java - 双击jar并在Mac上的命令提示符下运行同一jar时的不同行为

mysql - 在MySQL中创建触发器并更新