从数据库表中获取结果的更好选项

时间:2012-06-10 19:30:11

标签: java database jdbc plsql oracle10g

在调用返回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拨打的更好选择?

2 个答案:

答案 0 :(得分:1)

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

但是,从代码组织和维护的角度来看,我宁愿在数据库中而不是在Java应用程序中使用查询。例如,如果您发现查询使用的计划不佳,则如果查询位于存储过程中,则DBA可能更容易解决问题,而不是查询嵌入Java应用程序中。如果查询存储在数据库中,您还可以使用数据库的依赖关系跟踪功能,以便在需要执行某些操作时更轻松地执行影响分析,以确定emp表需要更改时会受到什么影响。 / p>

答案 1 :(得分:1)

好吧,我认为与 Java调用的观点没有重大区别。

我能想到的一些差异是:

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