ResultSetImpl throws NullPointerException



我正在使用MySQL 5.1.18连接器运行MySQL 5.5。样式的简单查询

select * from my_table where column_a in ('aaa','bbb',...) and column b=1;

从 Java 应用程序中执行。 查询返回一个包含 25k 行的结果集,每行 8 列。 在 while 循环中读取结果时

while(rs.next())
{
    MyObject c= new MyObject();  
    c.setA(rs.getString("A"));
    c.setB(rs.getString("B"));
    c.setC(rs.getString("C"));
    ...
}

通常在第几个循环期间引发以下异常,但绝不会在同一行中:

java.lang.NullPointerException
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5720)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5610)

我查看了 ResultSetImpl.java:5720 中的源代码,我看到了以下内容:

switch (metadata.getSQLType())

其中元数据是

Field metadata = this.fields[internalColumnIndex];

有趣的是,同一个元数据对象与其他 getter 一起被调用了无数次,并且没有抛出任何异常。

顺便说一句,直接在 MySQL 中运行时,上面的查询没有问题。应用程序在 AWS 中运行。

有什么想法可以解决这个问题吗?谢谢。

我遇到了这个问题,使用 Spring Data CrudRepository,从 AWS RDS 上运行的 MySql 数据库中检索结果流,查询中等复杂。

它还会在大约 30k 行之后抛出非确定性行。

我通过使用@Transactional注释调用方法来解决此问题。

尽管您没有使用 JPA,但为数据库访问设置事务可能有助于解决您的问题。

根据我的经验,此错误是尝试从同一表同时读取/写入时锁定表的结果。您需要为每个请求添加一个池,或者在 MySQL 的每个操作之间添加一些等待时间。

相关答案也:获取 java.sql.SQLException:ResultSet 关闭后不允许操作

相关内容

最新更新