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

her*_*y92 17 java oracle jdbc

while( result_set.next() )
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

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

And*_*ter 32

我已经建立了一个包含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);
Run Code Online (Sandbox Code Playgroud)

结果:

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

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


另请注意,获取大小会对内存消耗产生一些影响.有趣的是,使用Runtime.getRuntime().freeMemory();上述代码之前和之后的快速分析表明,影响比我预期的要小得多.我得到的数字是:

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

  • 很好的分析 (2认同)

Evg*_*eev 24

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