0

hiii,我在我的 Web 应用程序的 java 类中调用存储过程,有一些报告需要花费大量时间来呈现 jsp/HTML,我还使用存储过程查询进行了检查,它只需 2 秒即可执行甲骨文浏览器。我检查了我的 SP 调用代码,发现我的结果集获取时间非常短,但是当尝试使用 While(rst.next) 迭代结果集时,在 while 循环中打印 SOP 几乎需要 3 分钟,我怀疑 ret.next() 一定有问题,我的代码如下,

Connection connection   = null;
CallableStatement stmt  = null;
ResultSet rst           = null ;


connection = DBConnector.getConnection();

stmt = connection.prepareCall("{call MIS_GSGR_ASON.MIS_DIVNETSALE_ASON(?,?,?,?,?,?,?,?,?)}");


            stmt.setString(1,START_DT);                 
            stmt.setString(2,END_DT);                   
            stmt.setString(3,DIVISION);             
            stmt.setString(4,LOC_ID);   
            stmt.setInt(5,USER_GRP);
            stmt.setInt(6,FIELD_ID);
            stmt.setInt(7,Integer.parseInt(PERIOD_ID));
            stmt.setString(8,zone);
            stmt.registerOutParameter(9+INC,OracleTypes.CURSOR);
            stmt.execute();
            rst = (ResultSet) stmt.getObject(9+INC);

            System.out.println("Got resultset . . . .");

            data = new ArrayList<MainActionAll>();


            while(rst.next()){
            System.out.println("In loop");} 

任何帮助都将受到高度评价,请帮助我,谢谢,amol

4

1 回答 1

0

也许您通过慢速网络运行查询,如果返回很多行,它的运行速度很慢?

添加一些时间检查,而不是打印到控制台,只需计算记录:

...
...
...
stmt.registerOutParameter(9+INC,OracleTypes.CURSOR);
long t0, t1, t2, t3, t4, t5;
t0 = System.currentTimeMillis();
stmt.execute();
t1 = System.currentTimeMillis();
rst = (ResultSet) stmt.getObject(9+INC);
t2 = System.currentTimeMillis();
System.out.println("Got resultset . . . .");
data = new ArrayList<MainActionAll>();
t3 = System.currentTimeMillis();
t4 = t3;
t5 = t3;

int rec_cnt = 0;
if (rst.next())
    {
    ++rec_cnt;
    t4 = System.currentTimeMillis();
    while (rst.next())
        ++rec_cnt;
    t5 = System.currentTimeMillis();
    }
System.out.println("execute: " + (t1 - t0));
System.out.println("stmt.getObject: " + (t2 - t1));
System.out.println("Array: " + (t3 - t2));
System.out.println("1st next: " + (t4 - t3));
System.out.println("loop: " + (t5 - t4));
System.out.println("rec cnt: " + (rec_cnt));

尝试在尽可能靠近数据库服务器的地方执行它以减少网络传输(首选本地主机)。用那些时间编辑你的问题。

于 2012-07-19T08:30:45.470 回答