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