我第一次构建一个弹簧应用程序。我遇到了很多并发问题,我怀疑我管理后端的方式有问题。我看到的后端代码和示例之间的唯一区别是管理器类。
在我的代码中,我有我的模型(由 hibernate 管理)和我的 DAOs 在模型上执行 CRUD/搜索/等。在我看过的示例代码中,他们从不直接使用 DAO。相反,他们使用间接调用 DAO 的管理器类。对我来说,这似乎是毫无意义的代码重复。
这些经理课程有什么用?我读过他们将我的代码包装在“事务”中,但我为什么要这样呢?
我第一次构建一个弹簧应用程序。我遇到了很多并发问题,我怀疑我管理后端的方式有问题。我看到的后端代码和示例之间的唯一区别是管理器类。
在我的代码中,我有我的模型(由 hibernate 管理)和我的 DAOs 在模型上执行 CRUD/搜索/等。在我看过的示例代码中,他们从不直接使用 DAO。相反,他们使用间接调用 DAO 的管理器类。对我来说,这似乎是毫无意义的代码重复。
这些经理课程有什么用?我读过他们将我的代码包装在“事务”中,但我为什么要这样呢?
事务用于使更新“事务性”。
示例)用户单击一个网页,导致数据库中更新了 13 条记录。一个事务将确保 0 或 13 个更新通过,一个错误会使它全部回滚。
管理者必须让事情变得更容易。它们不会神奇地使您的代码线程安全。直接使用 DAO 本身并不是线程安全错误。
但是,我建议您限制 DAO 中的逻辑,并在业务层中放置尽可能多的逻辑。请参阅DAO 模式的最佳实践?
如果您发布的代码可能不能很好地与多线程一起使用的小示例,我们可以提出一些想法......但无论是事务还是管理器都无法解决您的问题。
许多应用程序有非平凡的需求,业务逻辑通常涉及对多个资源(例如多个 DAO)的访问、这些访问的协调以及跨这些访问的事务控制(如果您访问 DAO1 和 DAO2,您希望提交或回滚更改为一个不可分割的工作单元)。
因此,通常将这种复杂性封装和隐藏在专用服务组件中,以粗粒度的方式向客户端公开业务行为。
这正是您所指的经理正在做的事情,他们构成了服务层。
服务层从连接客户端层的角度定义了应用程序的边界 [Cockburn PloP] 及其可用操作集。它封装了应用程序的业务逻辑,控制事务并在其操作的实现中协调响应。
DAO 不应该拥有交易,因为他们无法知道它们是否只是更大交易的一部分。
服务层是事务所属的地方。你说它们是“毫无意义的代码重复”是不正确的。