【问题标题】:jdbc resultSet slow performancejdbc resultSet 性能慢
【发布时间】:2012-07-19 16:30:45
【问题描述】:

嘿嘿, 我在我的 web 应用程序的 java 类中调用存储过程,有一些报告需要花费大量时间来呈现 jsp/HTML,我还使用存储过程查询进行了检查,它在 oracle 浏览器中执行只需 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");} 

任何帮助都将得到高度评价,请帮助我 谢谢,阿莫尔

【问题讨论】:

  • 我不知道您在结果集迭代中通常会做什么,但是在紧密循环中打印到控制台的简单行为本身非常昂贵
  • 我只是想打印我在 while 循环中插入的 S.O.P,在获得结果集后我无法打印该语句,它需要太多时间才能在控制台上打印
  • 你可以用注释掉控制台的输出来计时你的代码吗?

标签: jdbc oracle10g


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多