2012-07-18 119 views
0

hiii, 我在我的web应用程序的java类中调用了一个存储过程,有一些报告花费了很多时间来渲染jsp/HTML,我也用存储过程查询它只需要2秒钟就可以在oracle浏览器中执行。我检查了我的SP调用代码,发现我的结果集获取时间非常少,但是当试图用While(rst.next)迭代结果集时,它几乎需要3分钟才能在while循环中打印SOP,我疑问必须有问题与ret.next(), 我的代码如下,jdbc resultset性能下降

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");} 

任何帮助将高度appriciated,请 感谢帮助我,AMOL

+1

我不知道你通常在你的结果集迭代中做什么,但在紧密的循环中打印到控制台的简单行为本身*非常昂贵 – 2012-07-18 10:15:00

+0

即时只是试图打印我插入的SOP在while循环中,在获得结果集后,我不能打印该语句,但它花费太多时间才能在控制台上打印 – Amol 2012-07-18 11:11:15

+0

您可以使用输出到控制台的代码将您的代码注释掉吗? – Olaf 2012-07-18 13:00:08

回答

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)); 

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