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 问题

Java8新特性都有哪些?

使用 MVC 模式在 JSP 页面中的 HTML <table> 中显示 JDBC ResultSet - NullPointerException

为啥我们不能只抛出异常/可抛出而不是有多个异常[重复]