【发布时间】: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 对象和错误地响应异常。您需要小心处理异常的方式,并且需要确保在关闭连接或结果集时其他线程不会继续尝试使用它。
标签: mysql jdbc mysql-connector connector-j