性能问题:结果集迭代

时间:2015-02-26 12:09:32

标签: java oracle java-ee

我希望有人澄清我的以下问题。

1)目前我正在从java代码调用过程并获取结果集。要迭代500个记录,需要20秒。我尝试了各种fetchSize,如50,100,300,501,2000,4000但没有改进。有人可以就此提出建议。

2)使用查询代替过程会改善结果集迭代性能吗?

3)还有其他建议吗?

代码段:

CallableStatement callableStatement =((SessionImpl)getSessionFactory().getCurrentSession()).connection().prepareCall("{ call Proc(?,?,?) }");
callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
callableStatement.setString(2,searchText.toLowerCase());
callableStatement.setInt(3, 500);

logger.debug("Before Query Execution");
callableStatement.executeUpdate();
logger.debug("After Query Execution:");
callableStatement.setFetchSize(501);
rs = (ResultSet)callableStatement.getObject(1);
logger.debug("Iterating ResultSet Starts");
Bean bean = null;
while(rs.next()){
logger.debug(“some logic but commented to check performance”);     
}

1 个答案:

答案 0 :(得分:0)

那么你的程序返回一个最多包含500行的游标? (callableStatement.setInt(3, 500);)。你为什么要用复杂的方法?

为什么不使用纯光标?使用生产者 - 消费者设计模式时,游标是有效的。如果你想" slurp"一些大量的数据,你也可以使用COLLECTION类型。让我们说,如果记录小于10000,则集合可能比光标更有效。但是简单的纯SQL语句应该是最快的。

你应该首先确定你的瓶颈。它可以是:

  • PERF。数据库方面的问题(执行计划。)
  • 与数据库的低效通信(往返客户端 - 服务器的数量)
  • Java EE相关的东西。像依赖注入一样,触发从DB返回的每一行。

PS:你的程序的源代码非常有用 PS1:如果你想使用生产者 - 消费者模式,你也应该使用FIRST_ROWS_N优化器目标。