gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:03:48 26 4
gpt4 key购买 nike

最近几天,我查看了其他人的代码,发现有很多 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com