对于oracle引用游标,结果集很慢

时间:2018-06-18 04:54:36

标签: java jdbc oracle12c

从过程获取游标结果集并迭代它比查询结果集慢得多。我有一个返回游标的过程,但需要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行。

感谢。

1 个答案:

答案 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