我有一个连接到oracle数据库的多线程程序。
第一个线程执行“大”查询,并将对象加载到LinkedBlockingQueue中。大约有200,000个物体。
第二个线程轮询这个列表,对于每个对象,它运行14个其他查询,更新对象参数。然后,我最后一次连接到另一个数据库,为当前对象获取相应的对象,创建一个包含这两个对象的混合对象,并将其发送到第三个线程。
对于这14个查询中的每个查询,我都使用一条语句和多个结果集。
stat=predefinedobject.getConnection().createStatement();
ResultSet rs = null;
ResultSet rs1 = null;
ResultSet rs2 = null;
ResultSet rs3 = null;
.
.
rs=stat.executeQuery(Query1);
while(rs.next()) {
object1.setParameter1(rs.getString(5));
}
SqlUtils.closeResultSet(rs);
rs1=stat.executeQuery(Query2);
while(rs1.next()) {
object1.setParameter2(rs1.getString(5));
}
SqlUtils.closeResultSet(rs1);
.
.
.
SqlUtils.closeResultSet(rs14);
SqlUtils.closeResultSet(stat);
过了一段时间后,我得到了空指针异常。
java.lang.NullPointerException
at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:876)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:825)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1049)
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:845)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1313)
发布于 2014-09-10 06:13:24
仔细检查您的sql查询字符串,看起来您连接了查询,但其中缺少一些空格。
例如:
String sql="select"+MYCOULUM+" form MYTABLE"
将生成以下字符串
selectMYCOULUM form MYTABLE
执行此类查询将导致oracle jdbc驱动程序出现此错误。
发布于 2018-10-04 20:15:06
在我的例子中,我使用大写的proc而不是小写的call
来调用存储的CALL
。
例如,{ ?= CALL proc_name(?) }
给出了相同的错误。一旦我切换到{ ?= call proc_name(?) }
,它就可以工作了
发布于 2014-09-10 02:38:58
javadoc表示-默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个对象的读取交错,则每个对象必须由不同的Statement对象生成。语句接口中的所有执行方法都隐式关闭语句的当前ResultSet对象(如果存在打开的对象)。
因此,每次要查询数据库时,可能都会尝试创建一个新的Statement对象
https://stackoverflow.com/questions/25751434
复制相似问题