使用JDBC for Oracle迭代ResultSet需要花费大量时间大约16秒?

时间:2013-07-19 10:38:13

标签: java oracle jdbc

while( result_set.next() )
{
  ...
}

我使用System.nanoTime()并计算时间,每次迭代所用的时间以毫秒为单位,但整个循环大约需要16秒。我正在考虑条件测试花费大量时间next()函数的可能原因。

仅供参考我正在连接到远程数据库服务器,并且我使用上述方法再次计算完成的选择查询(以毫秒为单位)。 有关为什么会发生这种情况的原因以及我如何将结果集迭代到最多一秒的时间?

修改

我正在处理大约4000条记录,每条记录包含大约10列,每列大小约为10个字符

EDIT2 谢谢setFetchsize()做了神奇,真棒,真棒

2 个答案:

答案 0 :(得分:31)

我已经设置了一个包含4000行和10列的表,每行包含10个字符,并使用以下方法进行了简单的性能测试(RealTimeCounter是一个测量start()stop()之间实际时间的类。 List<String> myResult = new ArrayList<>(); ResultSet rs = s.executeQuery("SELECT * FROM Performance"); RealTimeCounter rtc = new RealTimeCounter(); rtc.start(); while(rs.next()) { myResult.add(rs.getString(1)); } rtc.stop(); System.out.println(rtc); ):

Runtime.getRuntime().freeMemory();

<强>结果:

  • 默认提取大小:执行时间约为。 20秒
  • 获取大小= 100:执行时间约 2.2秒
  • 获取大小= 500:执行时间约 450毫秒
  • fetch size = 2000:执行时间约为 120毫秒
  • 获取大小= 4000:执行时间约 50毫秒
  • 获取大小= 4001:执行时间约 10毫秒(!!)

因此,提取大小确实会对执行速度产生重大影响。


另一方面,请注意,获取大小会对内存消耗产生一些影响。有趣的是,在上述代码之前和之后使用{{1}}进行快速分析表明,影响比我预期的要小得多。我得到的数字是:

  • 默认提取大小:665k
  • 获取尺寸= 100:665k
  • 获取尺寸= 500:665k
  • fetch size = 2000:743k
  • 获取尺寸= 4000:821k
  • 获取尺寸= 4001:861k

答案 1 :(得分:23)

尝试更改ResultSet提取大小。默认情况下,Oracle JDBC驱动程序一次只从数据库游标接收结果集10行。它可能不会显着提高性能,但还有许多其他选项可以让驱动程序更快地工作。