2

SYS_RECURSOR调用返回或调用查询的过程是否有任何性能改进?

例如

CREATE OR REPLACE PROCEDURE my_proc
(
  p_id number,
  emp_cursor IN OUT SYS_REFCURSOR
)
AS
BEGIN

OPEN emp_cursor for
select * from emp where emp_number=p_id
end;
/

Java并通过注册参数调用上述OUT方法,传递IN参数并获取结果。

或者

Java得到emp table结果

preparedStatement = prepareStatement(connection, "select * from emp where emp_number=?", values); 
resultSet = preparedStatement.executeQuery();

以上哪一项是更好的选择Java

4

2 回答 2

1

prepareStatement假设您的方法对所有绑定变量使用适当的类型,则没有性能差异。也就是说,您需要确保根据参数的数据类型调用setLongsetDate、等。setString如果您错误地绑定数据(即调用setString绑定数值),您可能会强制 Oracle 进行数据类型转换,这可能会阻止优化器使用可以提高性能的索引。

然而,从代码组织和维护的角度来看,我宁愿在数据库中而不是在 Java 应用程序中进行查询。例如,如果您发现查询使用了糟糕的计划,那么如果查询在存储过程中,那么 DBA 解决问题可能比在 Java 应用程序中嵌入查询要容易得多。如果查询存储在数据库中,您还可以使用数据库的依赖关系跟踪功能更轻松地进行影响分析,如果您需要做一些事情,例如确定emp表需要更改时会影响什么。

于 2012-06-10T19:43:47.387 回答
1

好吧,我不认为从Java 调用的角度来看有很大的不同。

我能想到的一些区别是:

  • 您现在必须维护两个不同的代码库:Java 代码和存储过程。如果出现错误,您将不得不在两个不同的地方进行调试,并在两个不同的地方修复问题。
  • 一旦生产就绪,除了更改部署的 Java 代码所需的那些之外,对数据库进行更改可能还需要一些额外的形式。
  • 另一个需要考虑的重要问题是数据库独立性,如果您正在构建一个产品来使用不同类型的数据库,您将被迫编写不同版本的存储过程,并且您将需要维护更多代码(调试、错误修复、变化等)。
  • 如果您正在构建一个您打算在不同(可能但未知)客户端的不同环境中部署的产品,这一点非常重要,您无法预测 RDBMS 将使用什么。
  • 如果您想使用 ORM 框架,即 Hibernate、EclipseLink),它将为您生成非常优化的查询。另外,如果您使用存储过程,以后集成它会更加困难。
  • 使用适当数量的日志记录很容易分析您的查询以进行优化。您可以使用 JDBC 日志记录或 ORM 提供程序提供的日志记录,并实际查看应用程序如何使用查询、使用次数、频率等,并优化重要的地方。
于 2012-06-10T19:46:34.080 回答