Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC for Oracle迭代ResultSet需要大约16秒的时间?_Java_Oracle_Jdbc - Fatal编程技术网

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);