Java 使用JDBC for Oracle迭代ResultSet需要大约16秒的时间?
我使用了Java 使用JDBC for Oracle迭代ResultSet需要大约16秒的时间?,java,oracle,jdbc,Java,Oracle,Jdbc,我使用了System.nanoTime()并计算了时间,每次迭代所用的时间以毫秒为单位,但整个循环大约需要16秒。我正在考虑条件测试花费大量时间的一个可能原因,即next()函数 仅供参考,我正在连接到远程数据库服务器,我所做的select查询将在毫秒内完成,再次使用上述方法计算。 关于为什么会发生这种情况,以及我如何将迭代结果集的时间减少到最多一秒,有什么原因吗 编辑: 我正在处理大约4000条记录,每条记录包含大约10列,每个列的大小约为10个字符 EDIT2 感谢setFetchsize(
System.nanoTime()
并计算了时间,每次迭代所用的时间以毫秒为单位,但整个循环大约需要16秒。我正在考虑条件测试花费大量时间的一个可能原因,即next()
函数
仅供参考,我正在连接到远程数据库服务器,我所做的select查询将在毫秒内完成,再次使用上述方法计算。
关于为什么会发生这种情况,以及我如何将迭代结果集的时间减少到最多一秒,有什么原因吗
编辑:
我正在处理大约4000条记录,每条记录包含大约10列,每个列的大小约为10个字符
EDIT2
感谢setFetchsize()尝试更改ResultSet FetchSize的神奇、令人敬畏、令人敬畏的功能。默认情况下,Oracle JDBC驱动程序一次只从数据库游标接收10行结果集。它可能不会显著提高性能,但没有很多其他选项可以让驱动程序更快地工作。尝试更改ResultSet获取大小。默认情况下,Oracle JDBC驱动程序一次只从数据库游标接收10行结果集。它可能不会显著提高性能,但没有很多其他选项可以让驱动程序更快地工作。我已经设置了一个包含4000行和10列的表,每个表包含10个字符,并使用以下方法进行了一个简单的性能测试(
realtimeconter
是一个测量start()之间实时性的类)
和停止()
):
List myResult=new ArrayList();
ResultSet rs=s.executeQuery(“从性能中选择*);
RealTimeCounter rtc=新的RealTimeCounter();
rtc.start();
while(rs.next()){
添加(rs.getString(1));
}
rtc.stop();
系统输出打印项次(rtc);
结果:
- 默认提取大小:执行时间约为20秒
- 获取大小=100:执行时间约为2.2秒
- 获取大小=500:执行时间约为450毫秒
- 获取大小=2000:执行时间约为120毫秒
- 获取大小=4000:执行时间约为50毫秒
- fetch size=4001:执行时间约为10毫秒(!!)
请注意,另一方面,获取大小对内存消耗有一定影响。有趣的是,使用
Runtime.getRuntime().freemory()进行快速分析但是,上面代码前后的代码显示,影响比我预期的要小得多。我得到的数字是:
- 默认提取大小:665k
- 取数大小=100:665k
- 取数大小=500:665k
- 取数大小=2000:743k
- 获取大小=4000:821k
- 取数大小=4001:861k
我设置了一个包含4000行和10列的表,每个表包含10个字符,并使用以下方法进行了简单的性能测试(realtimeconter
是一个测量start()
和stop()
之间实时性的类):
List myResult=new ArrayList();
ResultSet rs=s.executeQuery(“从性能中选择*);
RealTimeCounter rtc=新的RealTimeCounter();
rtc.start();
while(rs.next()){
添加(rs.getString(1));
}
rtc.stop();
系统输出打印项次(rtc);
结果:
- 默认提取大小:执行时间约为20秒
- 获取大小=100:执行时间约为2.2秒
- 获取大小=500:执行时间约为450毫秒
- 获取大小=2000:执行时间约为120毫秒
- 获取大小=4000:执行时间约为50毫秒
- fetch size=4001:执行时间约为10毫秒(!!)
因此,提取大小对执行速度有显著影响
请注意,另一方面,获取大小对内存消耗有一定影响。有趣的是,使用Runtime.getRuntime().freemory()进行快速分析但是,上面代码前后的代码显示,影响比我预期的要小得多。我得到的数字是:
- 默认提取大小:665k
- 取数大小=100:665k
- 取数大小=500:665k
- 取数大小=2000:743k
- 获取大小=4000:821k
- 取数大小=4001:861k
您认为您有多少条记录?结果集包含多少条记录?此外,了解while循环的全部代码是否都提供了也会很有帮助。要么记录太多,要么网络太慢。不要在这里责备JDBC。您的fetchSize
设置为什么?如果没有显式调用preparedStatement.setFetchSize()
,则可能会有一个小的默认值;一次抓取4000行与一次抓取4000行之间的差异可能相当大。不过,介于两者之间可能更合适,以避免使用太多资源——可能是100?这不会影响处理结果集的方式,只会影响它在后台执行的操作。4000次迭代可能需要从接近零到永恒的任意时间,这取决于您在循环中执行的操作。您认为您有多少条记录?结果集包含多少条记录?此外,了解while循环的全部代码是否都提供了也会很有帮助。要么记录太多,要么网络太慢。不要在这里责备JDBC。您的fetchSize
设置为什么?如果没有显式调用preparedStatement.setFetchSize()
,则可能会有一个小的默认值;一个ro的4000次回迁之间的差异
while( result_set.next() )
{
...
}
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);