ref游标和直接Java代码之间的性能差异

时间:2016-01-09 00:00:18

标签: java oracle performance jdbc plsql

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

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

public Builder startDate(String startDate) {
    // validate startDate here using checkArgument if it is not valid then throw IllegalArgumentException.
    this.sDate = startDate;
    return this;
}

在Java中:

FUNCTION FOO(a NUMBER) RETURN REF CURSOR IS

与第二种方法相比 - 使用Java进行查询,不涉及PL / SQL,我可以在两种方法中看到专家:

  1. 使用PL / SQL,它确实隐藏了Java开发人员的内部数据库表和结构,获得了某种封装;也可以在Java和其他PL / SQL包中重用相同的函数。
  2. 使用Java,它依赖于供应商。
  3. 说了上面的话,忽略了开发团队的技能,是否会有任何性能差异,网络带宽差异?您可以分享的任何见解和/或经验?

1 个答案:

答案 0 :(得分:0)

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

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

  

从Oracle Database 12c开始,PL / SQL存储的子程序可以返回查询   使用PL / SQL包DBMS_SQL隐式地向客户端发送结果   而不是OUT REF CURSOR参数。这种技术使其变得容易   迁移依赖于隐式返回查询结果的应用程序   从存储的子程序,从第三方数据库到Oracle数据库