JDBC Oracle结果集空指针异常

时间:2014-09-09 18:30:51

标签: java sql oracle exception jdbc

我有一个连接到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)

3 个答案:

答案 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(?) }后,它就可以工作了