论坛首页 Java企业应用论坛

Orcle driver的ResultSet.next()究竟做了什么?

浏览 1167 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-01-04   最后修改:2010-01-04
import java.sql.*;
import oracle.jdbc.OracleTypes;
import util.DateUtil;

public class Test4PS {

    public static void main(String[] args) {
        String driver = "oracle.jdbc.OracleDriver";
        String url = "XXXXXXXX";
        String user = "XXXXXX";
        String password = "XXXXXXXXX";
        Connection conn = null;
        Statement stmt = null;
        CallableStatement cs = null;
        ResultSet rs = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
            cs = conn.prepareCall("{Call XXXXXXXXXXXXX(?,?,?,?,?,?,?,?,?)}");
            cs.setInt(1, 2);
            cs.setInt(2, 2);
            cs.setInt(3, 200909);
            cs.setInt(4, 200910);
            cs.setInt(5, 0);
            cs.setString(6, "2");
            cs.setInt(7, 1);
            cs.setString(8, "0");
            cs.registerOutParameter(9, OracleTypes.CURSOR);
            cs.execute();
            rs = (ResultSet) cs.getObject(9);
            System.out.println("测试时间开始:");
            long start_time = System.currentTimeMillis();
            int k = 0;
            while (rs.next()) {//执行第一次rs.next()时,大概使用了20多秒,而执行第二次、第三次...时,大概是0.01秒
                if (k <= 100) {
                    test.CommonTool.println(k++);//
                }
            }
            rs.close();
            //stmt.close();
            //conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


-------------------------------------------------------------------------
1.主要问题:执行rs.next的第一次大概花费了20多秒,第二次以后平均0.01秒,为什么?

2.环境:ORACLE 10.2.0.4、class12.jar(10.2.0.4)

3.曾经使用过的解决方案:
更换Driver、同类procedure对比,不同类procedure对比,oraclecachedrowset。

4.测试结果
测试结果A.:仅发生在callprocedure之后,一般查询无此问题;
测试结果B.:在执行rs.next之前,这个procedure运行时间大概2分钟,当执行其他procedure也存在部分发生该情况;
测试结果C.:更换其他版本Driver(包括ojdbc14.jar),依然存在。

由于问答无人回答,请斑竹见谅。

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics