ResultSetImpl 抛出 NullPointerException
Posted
技术标签:
【中文标题】ResultSetImpl 抛出 NullPointerException【英文标题】:ResultSetImpl throws NullPointerException 【发布时间】:2012-05-21 04:55:46 【问题描述】:我正在使用 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 中运行。
任何想法如何解决这个问题? 谢谢。
【问题讨论】:
我试图在本地服务器上重现这个,但一切正常。我将限制查询的“in()”部分中的值的数量并执行多个选择,直到完成所有选择。 我在 mysql-connector-java 5.1.34 中遇到了类似的错误:原因是:com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:757) at com 上的 java.lang.NullPointerException .mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5240) at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5162) at (my code here) 我认为这可能是由较早的异常引起的:com .mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 连接关闭后不允许操作。 @atarno 你有没有找到解决问题的方法?我使用 mysql-connector 5.1.40 遇到了类似的异常。我的问题是here。 @Shannon 你有没有找到解决这个异常的方法?我使用 mysql-connector 5.1.40 遇到了类似的异常。我的问题是here。 @Eran 我不记得了,因为那是不久前的事了,但我记得问题出在多线程应用程序错误地共享 JDBC 对象和错误地响应异常。您需要小心处理异常的方式,并且需要确保在关闭连接或结果集时其他线程不会继续尝试使用它。 【参考方案1】:我遇到了这个问题,使用 Spring Data CrudRepository,从运行在 AWS RDS 上的 MySql 数据库中检索结果流,并进行了适度复杂的查询。
在大约 30k 行之后,它还会抛出一个不确定的行。
我通过使用 @Transactional 注释调用方法解决了这个问题。
虽然您没有使用 JPA,但为您的数据库访问设置事务可能会对您的问题有所帮助。
【讨论】:
【参考方案2】:根据我的经验,此错误是由于尝试从同一个表同时读取/写入时锁定表造成的。您需要为每个请求添加一个池,或者在对 MySQL 的每个操作之间添加一些等待时间。
相关答案: Getting java.sql.SQLException: Operation not allowed after ResultSet closed
【讨论】:
以上是关于ResultSetImpl 抛出 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
Facebook 集成错误 - NullPointerException
PostgreSQL JDBC 和 Android - NullPointerException
如何解决 app build sencha touch 问题
使用 MVC 模式在 JSP 页面中的 HTML <table> 中显示 JDBC ResultSet - NullPointerException