java - Oracle 引用游标的结果集很慢

标签 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 ps = con.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next()){ 
}

上述方法比使用 sys_refcursor 更快。请解释为什么使用 sys_refcursor 比普通查询花费更多时间。

PS:光标不会返回超过 20 行。

谢谢。

最佳答案

这应该会有帮助

http://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28621

By default, when Oracle JDBC runs a query, it retrieves a result set of 10 rows at a time from the database cursor. This is the default Oracle row fetch size value. You can change the number of rows retrieved with each trip to the database cursor by changing the row fetch size value.

用于设置和获取获取大小的Statement、PreparedStatement、CallableStatement 和 ResultSet 对象:

void setFetchSize(int rows) throws SQLException

int getFetchSize() throws SQLException

关于java - Oracle 引用游标的结果集很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50902848/

相关文章:

java - 为什么Java double 印格式根据是否使用String.format而不同

基于文本和基于控制台的表单的 Java 框架?

java - 循环空指针异常

java - ResultSet 可以用于直接填充表吗?

java - Hibernate:一对一映射无法正常工作

Java 获取 bash root 访问权限

java - PSQL异常 : ERROR: null value in column violates not-null constraint

java - 执行 JDBC 查询时出现异常 - 由于 Logstash 的时区偏移转换而导致非法即时

sql - Oracle 12 SQL - ORA-00933、ORA-0923、ORA-00979 我做错了什么?

Oracle 12c 客户端安装程序错误