Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ref游标和直接Java代码之间的性能差异_Java_Oracle_Performance_Jdbc_Plsql - Fatal编程技术网

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

ref游标和直接Java代码之间的性能差异,java,oracle,performance,jdbc,plsql,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.registerOutParame

在过去的几天里,我查看了一些其他人的代码,发现有很多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,我可以在两种方法中看到pro:

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

  • 如上所述,忽略开发团队的技能,会有任何性能差异、网络带宽差异吗?您有什么见解和/或经验可以分享吗

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

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

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


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

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

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


    谢谢你指出了一个非常有意义的观点。我同意,如果客户想要获取完整的结果集,双方应该真正讨论对象和对象集合。这提供了一个抽象层,并隐藏了执行状态,而在这种情况下,执行状态首先是不相关的。我还将研究查询结果的隐式返回。从表面上看,这似乎主要是为了简化Oracle和其他公司之间的迁移,但也可能提供一些灵活性。我会仔细看看并考虑一下。谢谢!你指出了一个非常有意义的观点。我同意,如果客户想要获取完整的结果集,双方应该真正讨论对象和对象集合。这提供了一个抽象层,并隐藏了执行状态,而在这种情况下,执行状态首先是不相关的。我还将研究查询结果的隐式返回。从表面上看,这似乎主要是为了简化Oracle和其他公司之间的迁移,但也可能提供一些灵活性。我会仔细看看并考虑一下。