4

我正在使用 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];

getSQLType 是返回 int 的无逻辑 getter。有趣的是,同一个元数据对象在上面的几行中与其他 getter 一起被多次调用,并且没有抛出异常。

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

任何想法如何解决这个问题?谢谢。

4

2 回答 2

1

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

在大约 30k 行之后,它还会抛出一个不确定的行。

我通过使用@Transactional 注释调用方法解决了这个问题。

尽管您没有使用 JPA,但为您的数据库访问设置事务可能会对您的问题有所帮助。

于 2018-03-12T23:51:06.590 回答
0

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

相关答案: Getting java.sql.SQLException: Operation not allowed after ResultSet closed

于 2016-01-21T07:29:28.623 回答