【发布时间】:2017-08-18 13:53:50
【问题描述】:
我正在使用带有存储过程的 CallableStatement 获取数据,ResultSet 有 12000 行,处理需要 30 秒。我尝试设置获取大小 (rs.setFetchSize(500) 但仍然需要相同的时间来获取整个数据(30 秒)。
callableStatement = conn.prepareCall(myProc);
callableStatement.setString("myParam", xyz);
callableStatement.registeroutputParameter("REVTAL", OracleTypes.CURSOR);
callableStatement .setFetchSize(1000); // I have tried with different values
rs = (ResultSet) callableStatement.getObject("REVTAL");
while(rs.next()) {`
myMethodToSetResultIntoList();
}
除了 fetch Size 之外,还有什么可能的方法来优化它吗?
我试过这个:
while(rs.next()) {`
logger(); // do nothing
}
它在大约 3 秒内处理了 12000 行,因此从 resultSet 获取数据会消耗时间。
此外,已确认 setfetchSize() 工作正常,因为未设置 fetch Size 它显示“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 秒。必须有一个解决方案。
提前致谢
【问题讨论】:
-
我认为您只有一个返回值,即
CURSOR。所以setFetchSize()不会有任何效果,因为它只加载一行...试试SELECT * FROM "myProc"(?) -
我认为 setFetchSize() 正在按预期工作,我已经尝试调试我的代码,并且在 rowCount 中它实际上显示了我在 setFetchSize() 中设置的数字。
-
我已经尝试过上述线程提供的解决方案,提供的解决方案是 setFetchSize()。
-
Java 中没有
While