【问题标题】:Money computations, comparison between java and Oracle/PL SQL which to use金钱计算,Java 和 Oracle/PL SQL 之间使用的比较
【发布时间】:2011-11-02 13:09:03
【问题描述】:

你们能否就 Oracle/PL SQL 和 Java 在处理货币计算时的优势和劣势给出一个很好的比较。 如果您要开发一个将处理大量金钱计算的应用程序,您会使用两者中的哪一个?为什么?

这个问题不是为了引发 oracle/pl sql 和 java 爱好者之间的争论,我只是想知道对于这种需求,什么被认为是最佳实践或标准方法以及背后的原因。

场景是:

  1. 数据将来自数据库(Oracle 10g 最低)。
  2. 该程序将根据聚合数据 (100k-1M) 记录计算和生成发票
  3. 业务规则非常复杂
  4. 业务规则可能每月至少更改一次
  5. 计算中将使用几个参考表
  6. 程序将每天运行一次

提前致谢。

【问题讨论】:

  • IMO 没有足够的信息来做出架构决策。有了这些要求,您就可以在 Java 和 PL/SQL 中做出好的解决方案...
  • 在这种情况下,我将在数据库中实现大部分逻辑,您可以在 Oracle 数据库中同时使用(Java 和 PL/SQL)来编写存储函数/过程等。
  • @Yahia:您将同时使用 Java 和 PL/SQL,并在数据库中执行大部分逻辑。这是否意味着您将使用 Java 来处理货币计算的模块?为什么不将 PL/SQL 也用于计算部分呢? Java 在金钱计算方面是否比 PL/SQL 更有能力/准确/高效?谢谢。
  • 使用 Java 不是因为金钱计算 - 这些都可以在两者中完成......但既然你说它真的很复杂,Java 更容易构建良好......你可以实现这一切PL/SQL(我个人比较喜欢),但不知道你对 PL/SQL 的精通程度
  • @Lukas Eder:做出架构决策需要哪些额外信息?

标签: java oracle plsql


【解决方案1】:

这些标准肯定有利于使用 PL/SQL。

1) 数据将来自数据库(Oracle 10g 最低)。
2)程序将根据汇总计算和生成发票 数据 (100k-1M) 记录
5) 计算中将使用几个参考表
6) 程序每天运行一次

如果它在数据库中并且涉及数据,尤其是大量数据,那么 PL/SQL 是默认选项。

其余的标准更难评估:

3) 业务规则非常复杂
4) 业务规则可能会在 每月至少一次

PL/SQL 绝对可以进行计算,并且它内置了很多算术函数。所以它归结为“业务规则”和“复杂”的确切含义。我们可以在 PL/SQL 中编写复杂的业务逻辑(我已经做到了),但 Java 具有无疑使任务更容易的语言特性:我正在考虑诸如反射和内省之类的东西。

也许您正在考虑使用规则引擎?当然,金融服务业一直是规则引擎的主要用户。并且从处理中抽象出规则集将更容易满足第四个标准。

Java 有两个已建立的规则引擎,Drools and JESS PL/SQL 中有一个规则引擎,并且已经有一段时间了,但它主要用作 Oracle Streams 的一部分。但是,API 是公开的,因此可以用于其他目的。 Find out more

如果您正在考虑规则引擎,那么我认为这会向 Java 倾斜。业务规则处理是一种专业的编程范式,Java 比 PL/SQL 有更多的经验和支持。我怀疑这意味着在中间层使用 Java 而不是 Java 存储过程,这对网络流量和性能有影响。

【讨论】:

  • 是的,规则引擎就是我的想法。标准 1,2,5,6 告诉我使用 pl/sql 但 3,4 适合 Java。还有一点是维护性,只是看起来更容易维护和增强java代码来改变业务规则。
【解决方案2】:

我认为你应该考虑的最重要的方面是“保持你的代码DRY”。您应该不惜一切代价避免将复杂的业务规则复制到 Java PL/SQL。话虽如此,您可能更喜欢将其大部分放在 PL/SQL 中,因为这样当您真正需要它时,它将在过程、视图等中可用。

无论如何,出于性能原因,考虑到应用于中等数据量的任务的复杂性,您可能会在数据库中执行“数据聚合”。因此,如果您确实需要用于聚合的业务规则,它们已经在数据库中可用。无需往返 Java。

【讨论】:

  • 数据聚合最有可能在货币计算部分之前执行,因此数据聚合并不是我真正关心的问题。我关心的是您将复杂规则应用于聚合数据以计算费率、折扣和税收的实际部分。在 Java 中,您可以选择使用规则引擎来简化事情,在 Java 中也有一组已建立的最佳实践来处理与金钱相关的计算。处理货币计算是否有 pl/sql 标准?我问是因为我也在考虑 100% 使用 pl/sql,但缺乏最佳实践让我很困扰。
  • @royjavelosa,我们正在为我们的银行软件进行大量的 PL/SQL 货币/利率计算。当您查看文档中的 Oracle 数据仓库示例(CUBEROLLUPCONNECT BYCommon Table Expressions 等)时,它们通常也与会计和银行业务有关。所以 PL/SQL 非常适合这项任务。问题是 PL/SQL 世界比 Java 世界封闭得多。这意味着访问“最佳实践”更加困难或成本更高。另一方面,Oracle 存储过程支持 Java。也许您可以在数据库中运行 Java 规则引擎
【解决方案3】:

您在这里面临一些有趣的权衡。

复杂、不断变化的业务逻辑?这对程序结构非常重视。 OO 技术肯定是适用的。因此,Java 似乎很合适。认真处理客户端也可能有助于测试和版本控制,这也很重要。

但是,带回一百万行来处理?这将是一个性能挑战。

通过纪律,您可以生成和维护结构良好的 PL/SQL。我的观察是,人们经常通过剪切和粘贴来重复使用,随着时间的推移,结构会丢失。我不知道 PL/SQL IDE 的当前状态如何,也许这些天有工具可以帮助重构。可以肯定的是,在 Java 世界中,重构工具非常好,因此保持良好结构的障碍很低。

我的理想情况是,对数百万行进行的某些查询会产生需要复杂处理的小数据集,而我们可以在 Java 中进行处理。因此,用于获取数据的 SQL 和用于处理数据的 Java——两者都达到了最佳状态,而无需支付过多的数据传输性能损失。我们对您的要求知之甚少,不知道这是否可行。

【讨论】:

  • 在 Java 中实现大多数,但不要在客户端执行它 - 只需将其导入 Oracle DB 服务器并在那里执行,将其与 som PL/SQL 结合起来(更适合的地方).. . 你得到了两全其美......具有最高性能,因为除了参数和最终结果之外什么都没有
  • @yahia,我同意,这似乎是前进的方向。
  • 是否重构主要是态度问题。如果你有态度你也可以用vi重构,因为你的代码已经“可重构”了
  • 好吧,当工具进入“提取方法”并确定参数时,它肯定会让生活变得轻松。我的模型是人们处于“内疚懒惰”的范围内,工具减少了努力,因此调整了平衡以有利于善良。如果我们对糟糕的代码不感到内疚,那也无济于事:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多