【发布时间】:2015-06-30 10:03:36
【问题描述】:
我的项目使用 N 层架构和通用框架:
- 表示层:JSF 2.0 + Primefaces
- 业务逻辑层:用于管理事务的 Spring
- 数据访问层:Spring Data + JPA
- 用于安全和用户管理的 Spring security
- 用于与外部系统集成的 Spring 集成
对于几乎所有的业务逻辑,我们都使用 Java 代码并驻留在业务层中,但我的客户要求我们将所有业务逻辑移入数据库并使用存储过程(数据库是 Oracle)。
如果将业务逻辑移至数据库,如下所示,我试图说服我的客户并给出一些劣势和优势:
缺点:
- 存储过程不是编程语言,它应该用于管理数据而不是编写逻辑代码
- 存储过程使逻辑变得复杂。使用存储过程可能难以实现一种逻辑,但如果使用 Java 等编程语言则非常容易
- 难以调试或单元测试
- 难以处理异常
- 难以维护、更新
- 存储过程无法与外部系统集成
- 当 ORM 框架对 CRUD 非常有用时,请花很多精力为每个表编写 CRUD
- 设计文档难以清晰
- 更多错误
- 减缓开发过程
- 数据库服务器将过载
- 数据库应该用于处理数据而不是用于流程逻辑
- 升级或添加新的数据库服务器既困难又昂贵,但使用应用服务器更容易且更便宜
- 打破 N 层架构和 ORM 框架
使用存储过程时:
- 性能:使用数据库处理批处理数据或长时间处理(作为报告...)
我的客户还说:他们想使用商店来修复项目而不重新部署。我解释说,当改变业务逻辑时,可能我们需要改变输入、输出和用户界面,那么我们仍然需要重新部署,我们应该把业务逻辑从数据库中拿出来。但他们拒绝了。
【问题讨论】:
-
如果您要使用存储过程,我认为不需要更改用户界面。
-
有些时候,改变逻辑需要改变UI。
-
这个问题是有缺陷的,因为它没有将面向写入的业务逻辑与面向读取的业务逻辑分开。我在存储过程中阅读支持和反对逻辑的论点越多,关于 CQRS 和不变性等内容的阅读越多,我就越发现优化写入和读取需要不同类别的业务逻辑。你在问什么,写和读逻辑的两个类别还是只有一个?您似乎理解了我同意的想法,即将数据量大、基于集合的操作放入存储过程中,例如用于报告或大规模操作。
标签: java spring stored-procedures logic