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

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

仅供参考,我正在连接到远程数据库服务器,并且我所做的选择查询在毫秒内完成,再次使用上述方法计算。关于它发生的原因以及我如何将时间迭代结果集降低到最多一秒钟的任何原因?

编辑:

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

EDIT2 感谢 setFetchsize() 做了魔法,太棒了,太棒了

4

2 回答 2

35

我已经建立了一个有 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);

结果:

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

因此,获取大小确实对执行速度有重大影响。


请注意,另一方面,提取大小对内存消耗有一些影响。有趣的是,使用Runtime.getRuntime().freeMemory();上述代码前后的快速分析表明,影响远小于我的预期。我得到的数字是:

  • 默认获取大小:665k
  • 获取大小 = 100: 665k
  • 获取大小 = 500: 665k
  • 获取大小 = 2000: 743k
  • 获取大小 = 4000: 821k
  • 获取大小 = 4001: 861k
于 2013-07-19T11:14:14.817 回答
26

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

于 2013-07-19T10:54:01.350 回答