【问题标题】:Resultset is slow for oracle ref cursororacle ref cursor 的结果集很慢
【发布时间】:2018-06-18 04:54:36
【问题描述】:

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

谢谢。

【问题讨论】:

  • 从数据库中用SYS_REFCURSOR 执行程序的时间是几点?

标签: java jdbc oracle12c


【解决方案1】:

这应该会有所帮助

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

【讨论】:

  • 在这种情况下,我已经尝试了 fetchSize 并没有帮助。
猜你喜欢
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多