【问题标题】:passing data from Oracle stored procedures to Java将数据从 Oracle 存储过程传递到 Java
【发布时间】:2011-11-16 20:43:41
【问题描述】:

我们将为一个基于 Oracle 数据库的大型系统编写一个新的 Web 界面。所有业务规则都已编码在PL/SQL 存储过程中,我们希望尽可能多地重用代码。我们将编写一些新的存储过程,它们将结合现有的业务规则并返回最终结果数据集。

我们希望在数据库级别执行此操作以避免 java-db 往返。接口层将用 Java 编写(我们希望使用 GWT),因此我们需要一种将数据从 Oracle 存储过程传递到 Java 服务端的方法。数据可以是例如特定项目的一组属性或满足特定条件的项目列表。 有人会推荐一种更好的方法吗?

我们正在考虑以下两种情况之一:

  • 传递对象和对象列表(在 架构级别)

  • 传递sys_refcursor

我们验证了这两种方法都是“可行的”,问题更多是关于设计决策、最佳实践、可能的维护问题、灵活性等。

我会很感激任何提示。

【问题讨论】:

    标签: java oracle stored-procedures object sys-refcursor


    【解决方案1】:

    我建议坚持使用具有明确定义的键的 refcursor(java 开发人员和 pl/sql 开发人员双方都同意)。这在将来更容易扩展,如果需要,您可以轻松地将 refcursor 转换为 hashmap,然后使用 apache bean utils 将 hashmap 转换为 POJO。我正在开展一个大型电信项目,该项目有多种解决此问题的方法,而 refcursor 最终似乎是最好的。

    【讨论】:

    • 您能否提供一些有关如何将refcursor 转换为Hashmap 然后再转换为POJO 的见解?谢谢
    【解决方案2】:

    在过去,我与经典的JDBC CallableStatement 完全一样,没有任何性能或维护问题。使用像Hibernate 这样的ORM 解决方案使持久性更加灵活,您可以将您的解决方案包装在Hibernate 周围,就像在这个post 中实现的那样。如果您还不熟悉存储过程和 CallableStatement 的工作方式,请参阅此example

    【讨论】:

    • 这个陈述回答了问题的哪一部分? OP 已经知道该怎么做;相反,他问的是哪种方法更好。
    • @Vineet Reynolds "有没有人推荐一种更好的方法?" - 并阅读之前的场景。
    • 考虑到发布的其他答案,推荐使用 CallableStatement 会增加什么价值?也许你应该按照自己的建议阅读场景;使用对象类型和引用游标并不容易,从长远来看也不是可维护的,OP 正在这些领域寻求建议。
    • @Vineet Reynolds“传递对象和对象列表(DB object types defined on the schema level)”和“传递sys_refcursor”的哪一部分你不明白吗?当您看到术语对象时,您会想到 POJO 吗?再读一遍。
    • 这个问题有这个陈述 - We verified that both approaches are "doable", the question is more about design decision, best practice, possible maintenance problems, flexibility, etc.,除了这个短语 - I have achieved exactly the same with classic JDBC CallableStatement without any perfomance or maintenance issues,我看不出你的答案如何解决任何这些问题,这只会使答案不完整。你还没有说明为什么有人必须考虑这个建议。
    【解决方案3】:

    我已经有一段时间没有做过类似的事情了,但我记得的方式是您需要定义一个调用存储过程的视图,然后您可以轻松地从 java 中读取结果集,使用您选择的 OR-mapper。

    因此,这似乎接近您的方案 1,根据我的经验,这从未引起任何问题。

    需要注意的一件事是事务处理:如果您的存储过程写入数据,并且您在 Java EE 事务中调用其中的几个,您可能会遇到数据不一致的情况。

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 1970-01-01
      • 2011-07-29
      • 2013-11-22
      • 2014-08-10
      • 1970-01-01
      • 2010-11-26
      • 2011-05-01
      • 1970-01-01
      相关资源
      最近更新 更多