我正在运行带有mysql 5.1.18连接器的MySQL5.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中运行。
有什么办法解决这个问题吗?谢谢。
发布于 2018-03-13 07:51:07
我遇到了这个问题,使用Spring Data CrudRepository从运行在AWS RDS上的MySql数据库中检索结果流,使用一个中等复杂的查询。
它还会在大约30k行之后的非确定性行抛出。
我通过用@Transactional注释调用方法解决了这个问题。
尽管您没有使用JPA,但是为您的数据库访问设置一个事务可能会对您的问题有所帮助。
发布于 2016-01-21 15:29:29
根据我的经验,这个错误是由于试图同时从同一个表中读取/写入时被锁定的表造成的。您需要为每个请求添加一个池,或者为MySQL的每个操作之间添加一些等待时间。
相关答案也是:Getting java.sql.SQLException: Operation not allowed after ResultSet closed
https://stackoverflow.com/questions/10570929
复制相似问题