ResultSet.next()花费了太多时间用于少量记录

时间:2014-11-13 14:11:20

标签: java oracle resultset ojdbc

我使用OJDBC(v7)连接到Oracle(11g)Java。 在某些大型表格中,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 **/
        ...
    }

为什么?!

1 个答案:

答案 0 :(得分:0)

在try catch块中使用:

if ((cnn==null)||cnn.isClosed()){
    cnn=DB.getDBConnection(); //e.g. DB is instance of class where getDBConnection() resides
}

然后调用查询。我相信你的代码中某处要么正在关闭连接,要么连接变为空,这就是你遇到这个问题的原因。

干杯