从过程中获取游标结果集并迭代它比查询结果集慢得多。我有一个返回游标的过程,但是需要5s来获取下一个结果集。
String callProcedure = "{ call SCHEMANAME.TEMP_PACKAGE.GET_CURSOR_RESULTS(?,?,?,?) }";
cs = con.prepareCall(callProcedure);
cs.setString(1, "Variable1");
cs.setString(2,"Variable2");
cs.setString(3,"Variable3");
cs.registerOutParameter(4, OracleTypes.CURSOR);
ResultSet rs = (ResultSet) cs.getObject(4);
while (rs.next()){
}我使用了日志,发现rs.next()有5-6秒的时间。所以我改变了逻辑如下,
String callProcedure = "{ call SCHEMANAME.TEMP_PACKAGE.GET_CURSOR_RESULTS(?,?,?,?,?) }";
cs = con.prepareCall(callProcedure);
cs.setString(1, "Variable1");
cs.setString(2,"Variable2");
cs.setString(3,"Variable3");
cs.registerOutParameter(4,java.sql.Types.VARCHAR);
cs.registerOutParameter(5,java.sql.Types.INTEGER);我从过程中获得了这些参数,并使用preparedStatement来执行游标中使用的查询。
PreparedStatement ps = con.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next()){
}上面的方法比使用sys_refcursor更快。请解释为什么使用sys_refcursor要花费比普通查询更多的时间。
PS:游标不会返回超过20行。
谢谢。
发布于 2018-12-08 01:20:53
这应该是有帮助的
01/java.112/e16548/resltset.htm#JJDBC28621
默认情况下,当Oracle JDBC运行查询时,它每次从数据库游标中检索10行的结果集。这是默认的Oracle行获取大小值。通过更改行获取大小值,可以更改每次访问数据库游标时检索的行数。
语句、PreparedStatement、CallableStatement和ResultSet对象,用于设置和获取获取大小:
void setFetchSize(int rows) throws SQLException
int getFetchSize() throws SQLExceptionhttps://stackoverflow.com/questions/50902848
复制相似问题