【发布时间】:2012-04-22 13:43:42
【问题描述】:
我有一个从数据库返回的游标在 31 毫秒(毫秒)内执行。
但是当我使用这个超过 1500 行的游标来获取行时
ResultSet rs = (ResultSet)cstm.getObject(6);
while(rs.next()){
system.out.println("...");
}
只需简单地遍历每一行光标就需要 40 多秒(40000 毫秒)
可以做什么?
【问题讨论】:
我有一个从数据库返回的游标在 31 毫秒(毫秒)内执行。
但是当我使用这个超过 1500 行的游标来获取行时
ResultSet rs = (ResultSet)cstm.getObject(6);
while(rs.next()){
system.out.println("...");
}
只需简单地遍历每一行光标就需要 40 多秒(40000 毫秒)
可以做什么?
【问题讨论】:
确实,默认情况下 JDBC 使用 10 的 fetch size。
因此,如果您不设置更大的值,您将准确调用数据库以获取下一条记录 150 次......,无需解释往返的缺点。
您所要做的就是通过将fetchSize 设置为.. 100 来测试性能,例如:
statement.setFetchSize(100);
您可以根据您的环境使用此数字来提高性能。
【讨论】:
您的 cursor 中有超过 1500 行,而 rs 数据库返回的只是对该游标的引用。因此,当您调用 rs.next() 时,每次它都会转到数据库 cursr 并获取光标指针指向的当前记录。
因此,显然每次都需要花费一些时间去数据库并在每次 while 循环迭代中获取超过 1500 次的单个记录。
【讨论】: