我有一个连接到oracle数据库的多线程程序。
第一个线程执行" big"查询并将对象加载到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)
答案 0 :(得分:2)
仔细检查你的sql查询字符串, 它似乎你连接查询但缺少一些空间。
例如;
String sql="select"+MYCOULUM+" form MYTABLE"
将生成以下字符串
selectMYCOULUM form MYTABLE
并执行此类查询将导致oracle jdbc驱动程序
出现此错误答案 1 :(得分:0)
javadoc表示 - 默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成。如果存在一个开放的对象,则Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。
因此,每次要查询数据库时都可能尝试创建一个新的Statement对象
答案 2 :(得分:0)
就我而言,我使用大写CALL
而不是小写call
来调用存储的proc。
例如,{ ?= CALL proc_name(?) }
给出了相同的错误。更改为{ ?= call proc_name(?) }
后,它就可以工作了