从过程获取游标结果集并迭代它比查询结果集慢得多。我有一个返回游标的过程,但需要5秒才能获取下一个结果集。
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行。
感谢。
答案 0 :(得分:0)
这应该有帮助
http://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28621
默认情况下,Oracle JDBC运行查询时,它将检索结果集 数据库游标一次最多10行。这是默认值 Oracle行提取大小值。您可以更改行数 通过更改行来每次访问数据库游标时检索 获取大小值。
Statement,PreparedStatement,CallableStatement和ResultSet对象,用于设置和获取提取大小:
void setFetchSize(int rows) throws SQLException
int getFetchSize() throws SQLException