java - 引用游标和直接 Java 代码之间的性能差异

标签 java oracle performance jdbc plsql

最近几天,我查看了其他人的代码,发现有很多 PL/SQL 函数返回 REF CURSOR。然后在 Java 中使用 CallableStatement 调用这些函数。

例如,PL/SQL 中可能定义了一个函数:

FUNCTION FOO(a NUMBER) RETURN REF CURSOR IS

在 Java 中:

CallableStatement call = connection.prepareCall("{ ? = call foo(?) }");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.setInt(2, 12345);
call.execute();
resultSet = (ResultSet)call.getObject(1);
while (resultSet.next()) {

与第二种方法(在 Java 中植入查询,不涉及 PL/SQL)相比,我可以看到这两种方法的优点:

  1. 使用 PL/SQL,它确实向 Java 开发人员隐藏了内部数据库表和结构,从而获得了某种封装;同样的函数也可以在 Java 和其他 PL/SQL 包中重用。
  2. 使用 Java,它对供应商的依赖性要小得多。

话虽如此,并且忽略开发团队的技能组合,是否会存在性能差异、网络带宽差异?您可以分享任何见解和/或经验吗?

最佳答案

我认为这取决于应用程序在 while (resultSet.next()) 循环内执行的操作。例如,如果您在 Oracle 和客户端之间来回传递引用游标,那么引用游标将会很有用。

如果客户端获取所有行,我宁愿采用稍微不同的解决方案 - 重写函数,以便它们返回对象集合,并在客户端使用 TABLE 函数(例如 SELECT * FROM TABLE(Foo(1))) 。它可能适合您,也可能不适合您(例如,如果您有其他真正受益于使用 REF CURSOR 的 PL/SQL 过程/函数)。
另外,可能值得尝试隐式语句结果(http://docs.oracle.com/database/121/LNPLS/release_changes.htm#LNPLS118)-

As of Oracle Database 12c, a PL/SQL stored subprogram can return query results to its client implicitly, using the PL/SQL package DBMS_SQL instead of OUT REF CURSOR parameters. This technique makes it easy to migrate applications that rely on the implicit return of query results from stored subprograms from third-party databases to Oracle Database

关于java - 引用游标和直接 Java 代码之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34688082/

相关文章:

java - 泛型与功能相似方法的 Eclipse 错误

database - 如何在 oracle11g 中定义引用该类型集合的类型?

performance - VBS vs PowerShell : Which is lighter?

javascript - 禁用浏览器页面的特定事件

performance - 如果由于某种原因必须停止迭代,将结果保存在 Matlab 中的有效方法是什么?

java - 当 XSD 元素没有定义类型(类型 ur-type)但 SOAP 响应中返回子类型时,Axis2 会失败?

java - Selenium - driver.getPageSource() 与从浏览器查看的源不同

java - 如何最好地删除文件中的某些字符串?

database - Oracle 执行计划改变

mysql - 如何检查同一变量 SQL 中的多个值