Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC Oracle结果集空指针异常_Java_Sql_Oracle_Exception_Jdbc - Fatal编程技术网

Java JDBC Oracle结果集空指针异常

Java JDBC Oracle结果集空指针异常,java,sql,oracle,exception,jdbc,Java,Sql,Oracle,Exception,Jdbc,我有一个连接到oracle数据库的多线程程序 第一个线程执行一个“大”查询,并将对象加载到LinkedBlockingQueue中。大约有200000个物体 第二个线程轮询此列表,并为每个对象运行14个其他查询,更新对象参数。然后我连接到另一个数据库,最后一次,获取当前对象的对应对象,创建一个包含这两个对象的混合对象,并将其发送到第三个线程 我对这14个查询中的每一个都使用一条语句和多个结果集 stat=predefinedobject.getConnection().createSta

我有一个连接到oracle数据库的多线程程序

第一个线程执行一个“大”查询,并将对象加载到LinkedBlockingQueue中。大约有200000个物体

第二个线程轮询此列表,并为每个对象运行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)
默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交织在一起,则每个ResultSet对象都必须由不同的语句对象生成。如果存在打开的Statement对象,则Statement接口中的所有执行方法都会隐式关闭Statement的当前ResultSet对象

因此,每次您想要查询数据库时,可能会尝试创建一个新的语句对象。默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交织在一起,则每个ResultSet对象都必须由不同的语句对象生成。如果存在打开的Statement对象,则Statement接口中的所有执行方法都会隐式关闭Statement的当前ResultSet对象


因此,每次要查询数据库时,可能会尝试创建一个新的语句对象

仔细检查sql查询字符串, 看起来您连接了查询,但缺少了一些空间

比如,

String sql="select"+MYCOULUM+" form MYTABLE"
将生成以下字符串

selectMYCOULUM form MYTABLE

执行这样的查询将导致oracle jdbc驱动程序出现此错误

请仔细检查sql查询字符串, 看起来您连接了查询,但缺少了一些空间

比如,

String sql="select"+MYCOULUM+" form MYTABLE"
将生成以下字符串

selectMYCOULUM form MYTABLE

执行这样的查询将导致oracle jdbc驱动程序出现此错误

在我的例子中,我使用大写的
调用
,而不是小写的
调用
,来调用存储的过程


例如,
{?=callproc_name(?)}
给出了相同的错误。一旦我更改为
{?=call proc_name(?)}
它就开始工作了

在我的例子中,我使用大写的
调用
而不是小写的
调用
来调用存储的过程



例如,
{?=callproc_name(?)}
给出了相同的错误。一旦我更改为
{?=call proc_name(?)}
它就开始工作了

但我仍然得到了相同的空指针异常。
java.lang.NullPointerException位于oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:876)位于oracle.jdbc.driver.T4CStatement.executeForedScribe(T4CStatement.java:825)在oracle.jdbc.driver.OracleStatement.ExecuteMayBedDescripte(OracleStatement.java:1049)在oracle.jdbc.driver.T4CStatement.ExecuteMayBedDescripte(T4CStatement.java:845)在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154)在oracle.jdbc.driver.OracleStatement
由于错误似乎发生在驱动程序内部,我宁愿将其归因于驱动程序中的一个错误。@markrotVeel类似的问题已经结束,可能是一些问题,我想这是一些查询problem@SparkOn它仍然描述了驱动程序中的错误;JDBC驱动程序应该只抛出
SQLException
,所有其他的都应该被认为是驱动程序错误。但是同意:使用导致异常的实际查询可能有助于找到解决方法。但我还是得到了相同的空指针异常。
java.lang.NullPointerException位于oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:876)位于oracle.jdbc.driver.T4CStatement.executeforderDescripte(T4CStatement.java:825)在oracle.jdbc.driver.OracleStatement.ExecuteMayBedDescripte(OracleStatement.java:1049)在oracle.jdbc.driver.T4CStatement.ExecuteMayBedDescripte(T4CStatement.java:845)在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154)在oracle.jdbc.driver.OracleStatement
由于错误似乎发生在驱动程序内部,我宁愿将其归因于驱动程序中的一个错误。@markrotVeel类似的问题已经结束,可能是一些问题,我想这是一些查询problem@SparkOn它仍然描述了驱动程序中的错误;JDBC驱动程序应该只抛出
SQLException
,所有其他的都应该被认为是驱动程序错误。但是同意:使用导致异常的实际查询可能有助于找到解决方法。什么是Oracle服务器和驱动程序版本?我认为我们使用的是Oracle 11g,不知道驱动程序版本,尽管错误似乎发生在驱动程序内部,这可能表明驱动程序中存在错误;或者,您的
SqlUtils.closeResultSet
会忽略可能导致驱动程序内部状态不一致的异常(这仍然是驱动程序中的一个bug)。我建议您1)检查驱动程序版本并升级到最新版本,2)检查您的实用工具方法是否忽略异常,并查看是否存在异常。此错误也可能是由于查询Oracle server和驱动程序版本中的sintax错误造成的?我想我们使用的是Oracle 11g,不知道驱动程序版本,尽管错误似乎发生在驱动程序内部,这可能表明驱动程序中存在错误;或者,您的
SqlUtils.closeResultSet
会忽略可能导致驱动程序内部状态不一致的异常(这仍然是驱动程序中的一个bug)。我建议您1)检查驱动程序版本并升级到最新版本,2)检查您的实用程序方法是否忽略异常,并查看是否有异常发生。此错误也可能是由于查询中的sintax错误造成的,我将
CALL
更改为