Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 ResultSet方法next()需要30秒才能获取12000行_Java_Oracle_Jdbc - Fatal编程技术网

Java JDBC ResultSet方法next()需要30秒才能获取12000行

Java JDBC ResultSet方法next()需要30秒才能获取12000行,java,oracle,jdbc,Java,Oracle,Jdbc,我使用CallableStatement和stored proc获取数据,ResultSet有12000行,处理需要30秒。我曾尝试设置fetch size(rs.setFetchSize(500))但仍然需要相同的时间来获取整个数据(30秒) 除了获取大小之外,是否有其他可能的方法来优化它 我试过这个: while(rs.next()) {` logger(); // do nothing } 它在大约3秒钟内处理了12000行,因此从resultSet获取数据的时间

我使用CallableStatement和stored proc获取数据,ResultSet有12000行,处理需要30秒。我曾尝试设置fetch size(rs.setFetchSize(500))但仍然需要相同的时间来获取整个数据(30秒)

除了获取大小之外,是否有其他可能的方法来优化它

我试过这个:

while(rs.next()) {`
        logger(); // do nothing
    }
它在大约3秒钟内处理了12000行,因此从resultSet获取数据的时间越来越长

此外,还确认setfetchSize()工作正常,因为在没有设置FetchSize的情况下,它将“fetchedRowCount”显示为10,而setfetchSize()显示为x,则在调试模式下将“fetchRowCount”显示为x

实际while循环如下所示:

while(rs.next()) {
    Myclass mc = new Myclass();
    mc.setA(rs.getString("parameterA");
    mc.setB(String.valueOf(rs.getLong("parameterB");
    //4 more string parameters same
    mc.setG(myMethodToConvertDate(rs.getDate("Date");
    myList.add(mc);
}
因此,从resultSet中检索数据并将其添加到myList大约需要25秒。对此,必须有解决方案


提前感谢

关于fetchSize的一点说明。在您的代码中有一个带有out参数和游标的CallableStatement。SetFetchSize对CallableStatement没有影响,因为它只返回一组结果,即out参数。在这种情况下,只有一个out参数,即游标。getCursor调用返回结果集

据我所知,JDBC规范中没有规定从游标创建的ResultSet的fetchSize应该是什么。(我的内存可能出错。)Oracle数据库JDBC驱动程序将游标ResultSet的fetchSize设置为与创建它的语句相同

因此,在本例中,设置CallableStatement的fetchSize对CallableStatement检索到的结果没有任何影响,但它设置了从游标创建的ResultSet的fetchSize。因此,Usagi Miyamoto的注释至少在CallableStatement方面是正确的,但您的注释表明您看到了预期的行为从设置fetchSize也是正确的

在游标ResultSet上迭代将从数据库中获取所有数据。您声明这大约需要3秒。处理行时大约需要20秒。设置fetchSize不会加快(或减慢)行处理,只会加快数据库获取。因此在限制范围内设置fetchSize不会加快速度。(这些限制是fetchSize必须足够大以最小化数据库往返次数,并且足够小以保持合理的内存占用。100通常是一个好数字。很少有比100大得多的东西明显更好。)


但fetchSize为1000时,您的代码将在3秒内获取所有行。100可能会让您的应用程序运行得更快,因为它使用的内存更少,但这是您的问题的次要部分。您真正的问题是,为什么处理12000行需要约17秒?不是提取行,而是处理行。这是列的数量和类型的函数ns及其处理方式。您没有提供这方面的任何信息。

我认为您只有一个返回值,那就是
光标
。因此
setFetchSize()
不会有任何效果,因为它只加载一行……请尝试类似于
SELECT*FROM“myProc”(?)
可能与我认为的setFetchSize重复()按预期工作,我尝试调试我的代码,在rowCount中,它实际上显示了我在setFetchSize()中设置的数字。我尝试了上述线程上提供的解决方案,提供的解决方案是setFetchSize()。在Java中没有

while(rs.next()) {
    Myclass mc = new Myclass();
    mc.setA(rs.getString("parameterA");
    mc.setB(String.valueOf(rs.getLong("parameterB");
    //4 more string parameters same
    mc.setG(myMethodToConvertDate(rs.getDate("Date");
    myList.add(mc);
}