首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于oracle游标来说,Resultset很慢。

对于oracle游标来说,Resultset很慢。
EN

Stack Overflow用户
提问于 2018-06-18 04:54:36
回答 1查看 1.2K关注 0票数 2

从过程中获取游标结果集并迭代它比查询结果集慢得多。我有一个返回游标的过程,但是需要5s来获取下一个结果集。

代码语言:javascript
复制
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秒的时间。所以我改变了逻辑如下,

代码语言:javascript
复制
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来执行游标中使用的查询。

代码语言:javascript
复制
PreparedStatement ps = con.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next()){ 
}

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

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-12-08 01:20:53

这应该是有帮助的

01/java.112/e16548/resltset.htm#JJDBC28621

默认情况下,当Oracle JDBC运行查询时,它每次从数据库游标中检索10行的结果集。这是默认的Oracle行获取大小值。通过更改行获取大小值,可以更改每次访问数据库游标时检索的行数。

语句、PreparedStatement、CallableStatement和ResultSet对象,用于设置和获取获取大小:

代码语言:javascript
复制
void setFetchSize(int rows) throws SQLException

int getFetchSize() throws SQLException
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50902848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档