2

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

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

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

  • 传递对象和对象列表(在模式级别定义的 DB 对象类型)

  • 通过一个sys_refcursor

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

我会很感激任何提示。

4

3 回答 3

2

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

于 2011-09-14T10:25:04.380 回答
1

JDBC CallableStatement在过去,我在没有任何性能或维护问题的情况下实现了与经典完全相同的效果。使用ORM解决方案(如Hibernate使持久性更加灵活),您可以将您的解决方案包装为本文中Hibernate实现。如果您还不熟悉存储过程和 CallableStatement 的工作方式,请参阅此示例。

于 2011-09-14T10:20:28.400 回答
0

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

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

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

于 2011-09-14T10:24:05.110 回答