gpt4 book ai didi

java - 如何将UnitOfWork模式与IdentityMap模式一起使用?

转载 作者:行者123 更新时间:2023-12-02 11:06:38 25 4
gpt4 key购买 nike

在 Martin Fowler 的书中,我读到了 UnitOfWorkIdentityMap 模式。

作者提到将 IdentityMap 放入 UnitOfWork 中是一个好主意。但如何做到呢?

据我了解 IdentityMap 受 session 限制,但作者没有提到 UnitOfWork

  1. UnitOfWork 实例是否受 session 限制?

  2. 假设我们有客户和订单实体。

    public clas Client{

    List<Order> orders;
    ...
    }

我们收到更新客户信息(电话号码)并添加新订单的请求:

这里需要多少个unitOfWork实例?每个 session ?我们应该为客户和订单提供单独的实例吗?

这里我们需要多少个 IdentityMap 实例?对于每个实例?我们应该为客户和订单提供单独的实例吗?

每个unitOfWork实例需要多少个IdentityMap实例?

如果我们有 2 个并发请求怎么办?

最佳答案

工作单元需要根据您需要管理的业务操作的持续时间确定范围。如果您的业务操作扩展到多个请求,但需要将其视为单个工作单元,则必须以一致的范围(例如 session )处理实例。

工作单元将跟踪与数据库的所有交互,并通过创建事务并以最佳方式(在短期数据库事务中)进行更改来确认它们。

JPA/Hibernate 默认实现此模式,因此通常如果您使用它们,则无需自己实现。JPA/Hibernate 还在一级缓存中实现了类似于 Identity Map 模式的东西。它将实体映射保存在其第一级缓存中,避免在 session 和工作单元期间多次查找数据库。

正如 hibernate 文档所述( read me ):

The most common pattern in a multi-user client / server application is session-per-request. In this model, a request from the client is sent to the server, where the Hibernate persistence layer runs. A new Hibernate Session is opened, and all database operations are executed in this unit of work. On completion of the work, and once the response for the client has been prepared, the session is flushed and closed. Use a single database transaction to serve the clients request, starting and committing it when you open and close the Session. The relationship between the two is one-to-one and this model is a perfect fit for many applications.

因此,您的 IdentityMap 的范围应与您的业务交易相关联,从而与您的 UnitOfWork 的状态相关联,该状态将跟踪您的业务交易期间的所有更改。

如果您的应用程序处理短事务(例如每个请求),这将非常简单。如果您有一个跨越多个请求的长期工作单元,您的工作单元必须位于 session 范围内,并且您的身份映射附加到它。

在这种情况下,管理数据库的良好锁定策略是关键,以避免并发更改出现问题(在这种情况下,当提交时间更容易到达时,请求中读取的实体可能已被修改)。

在 java 中实现该模式的一个基本示例是(不深入讨论范围问题):https://github.com/iluwatar/java-design-patterns/tree/master/unit-of-work

关于java - 如何将UnitOfWork模式与IdentityMap模式一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58238361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com