【问题标题】:Performance difference between ref cursor and straight Java code引用游标和直接 Java 代码之间的性能差异
【发布时间】:2016-04-13 18:53:46
【问题描述】:

最近几天,我查看了一些其他人的代码,发现有很多 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,它对供应商的依赖性大大降低。

说了这么多,忽略开发团队的技能,会不会有性能差异,网络带宽差异?您可以分享任何见解和/或经验吗?

【问题讨论】:

    标签: java oracle performance jdbc plsql


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!你指出了一个非常有意义的观点。我同意,如果客户端要提取完整的结果集,那么双方应该就对象和对象集合进行真正的讨论。这提供了一个抽象层,并隐藏了执行状态,这在这种情况下首先是不相关的。我还将看一下查询结果的隐式返回。从表面上看,它主要是为了简化 Oracle 和其他人之间的迁移,但它也可能提供一些灵活性。我会仔细看看并考虑一下。
    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多