gpt4 book ai didi

java - 使用 JDBC for Oracle 迭代 ResultSet 需要很多时间,大约 16 秒?

转载 作者:太空狗 更新时间:2023-10-29 22:36:20 24 4
gpt4 key购买 nike

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

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

仅供引用,我正在连接到一个远程数据库服务器,我所做的选择查询在毫秒内完成,再次使用上述方法计算。关于为什么会发生这种情况以及我如何将迭代结果集的时间减少到最多一秒的任何原因?

编辑:

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

编辑2感谢 setFetchsize() 发挥了神奇作用,太棒了,太棒了

最佳答案

我建立了一个 4000 行 10 列的表,每列 10 个字符,并使用以下方法进行了简单的性能测试(RealTimeCounter 是一个测量 之间实时时间的类开始()停止():

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 秒
  • 获取大小 = 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

关于java - 使用 JDBC for Oracle 迭代 ResultSet 需要很多时间,大约 16 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17744090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com