我正在使用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 关闭后不允许操作