Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 ResultSet.next()占用的时间太多,记录太少_Java_Oracle_Resultset_Ojdbc - Fatal编程技术网

Java ResultSet.next()占用的时间太多,记录太少

Java ResultSet.next()占用的时间太多,记录太少,java,oracle,resultset,ojdbc,Java,Oracle,Resultset,Ojdbc,我在Java中使用OJDBC(v7)连接到Oracle(11g)。 在某些情况下,在一些大表上,Resultset无法在适当的时间获取数据 例如,输出记录只有2条,但在Resultset.next()上,java冻结并等待太长时间 注1:问题不在于设置FetchSize(),RsultSet.TypeX,而不是使用连接池,如c3p0我已经测试了所有这些。 注2:另外,当我直接在navicat中运行查询时,结果显示得非常完美 获取连接方法: public Connection getDBConne

我在
Java
中使用
OJDBC(v7)
连接到
Oracle(11g)
。 在某些情况下,在一些大表上,
Resultset
无法在适当的时间获取数据

例如,输出记录只有2条,但在
Resultset.next()上,
java冻结并等待太长时间

注1:问题不在于设置
FetchSize()
RsultSet.TypeX
,而不是使用连接池,如
c3p0
我已经测试了所有这些。

注2:另外,当我直接在
navicat
中运行查询时,结果显示得非常完美

获取连接方法:

public Connection getDBConnection() throws DBConnectionException {
        Connection conn = null;

        String connectionUrl;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:user/pass@xxx.xxx.xxx.xxx:1521:DBNAME");

        } catch (Exception e) {
            e.printStackTrace();
            throw new DBConnectionException();
        }

        return conn;
    }
连接到DB部件:

    ...
    conn = connectionManager.getDBConnection();
    conn.setAutoCommit(false);
    String query = "{call ...(...)}";
    CallableStatement stmt = conn.prepareCall(query,ResultSet.TYPE_FORWARD_ONLY,
                    ResultSet.CONCUR_READ_ONLY);
    stmt.setFetchSize(10000); 
    .
    .
    .
    stmt.registerOutParameter(x, OracleTypes.CURSOR);
    stmt.execute();
    Resultset rs = (ResultSet) stmt.getObject(x);

    while (rs.next()) {    /** Problem occurs here **/
        ...
    }

为什么

在try-catch块中使用:

if ((cnn==null)||cnn.isClosed()){
    cnn=DB.getDBConnection(); //e.g. DB is instance of class where getDBConnection() resides
}
然后调用查询。我相信在代码中的某个地方,要么关闭连接,要么连接变为空,这就是您面临此问题的原因


干杯

在创建SP query调用后,您是否真的手动提交了事务?在客户端应用程序和JDBC中运行时,您是否比较了查询计划?可能是客户端应用程序使用FIRST_ROWS(x)提示,但JDBC使用ALL_ROWS模式,执行计划不同,并且客户端返回行的速度比JDBC快。