当前位置: 首页 > 知识库问答 >
问题:

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

佴英奕
2023-03-14

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

作者提到,将identityMap放在UnitOfWork内部是一个好主意。但怎么做呢?

据我所知,identitymap受会话限制,但作者没有提到UnitofWork

public clas Client{

     List<Order> orders;
    ...
}

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

如果我们有两个并发请求呢?

共有1个答案

孟沛
2023-03-14

问:UnitOfWork实例是否受会话限制?

在马丁的书的第11章中,你读到:

“一个工作单元跟踪您在可能影响数据库的业务事务期间所做的一切。完成后,它会计算出作为您工作的结果而需要进行的更改数据库的所有操作。[...]

class UnitOfWorkServlet...

   final protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      try {
         UnitOfWork.newCurrent();
         handleGet(request, response);
         UnitOfWork.getCurrent().commit();
      } finally {
         UnitOfWork.html" target="_blank">setCurrent(null);
      }
   }

   abstract void handleGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException; 

在本例中,您可以将会话理解为UnitOfWork。在书的后面,他解释说:

“如果您有多个映射,明显的路径是每个类或每个表一个映射,如果您的数据库模式和对象模型相同,这会很好地工作。“

在后面的几段中,Martin解释了identitymap的位置:

现在,“业务事务”的范围可能是短暂的,例如,绑定到HTTP请求的生命期,就像Martin Fowler在上面的例子中那样,其中UnitOfWork似乎绑定到每个请求的线程本地变量。

或者“业务事务”可以包含多个请求,例如在JPA中有一个扩展持久性上下文的概念,其中JPA中的持久性上下文对应于UnitOfWork模式。在扩展的持久性上下文中,业务事务扩展的时间更长。一个典型的例子是购物车:当用户开始将项目放入购物车时,就会创建上下文/工作单元,直到用户签出购物车(提交更改)或会话过期(丢弃工作单元中的所有内容),上下文才会被清除。

现在,还有应用程序管理上下文的思想,这基本上意味着,在您认为合适的时候启动您的工作单元,在您不再需要它的时候关闭它。例如,假设您有一个桌面应用程序和一个具有隔离并发性的小型数据库(即每个用户只管理自己的数据,从不与其他用户的数据冲突)。假设用户的数据可以完美地放入计算机的内存中。在这种情况下,您可以在应用程序开始时启动UnitOfWork,并将其用作数据库的某种缓存。适当时,可以将UnitOfWork刷新到磁盘上,例如当用户单击save按钮时,但仍保持其活动状态。当用户关闭应用程序时,UnitOfWork将被丢弃。

根据到目前为止的解释,您可以有多个工作单元,其中包括以下原因:

  • 每个请求一个UnitWork,如果您的应用程序处理并发请求,那么您将同时拥有多个工作实例单元。
  • 每个扩展事务都有一个UnitOfWork绑定到用户的会话。如果有多个用户,则可以有多个工作单元。

然而,除了这些,我还发现了其他原因,为什么你可能希望在同一“业务交易”期间产生一个新的工作单元。

 类似资料:
  • 我尝试使ajv使用两个JSON-Schema,一个依赖于另一个。下面是我的模式的一个示例(简化): json 错误:没有带有键或引用“http://json-schema.org/draft-04/schema#”的模式 更新:如果我从types.json中删除“$schema…”,我得到的错误是: MissingReferror:无法从id#中解析引用types.json#/definition

  • 我正在读取Kafka的流,我将Kafka的值(即JSON)转换为结构。 有一个变体,它采用类型的模式,但我找不到示例。请告知下面代码中的错误。 错误 程序

  • 问题内容: 使Super Dev模式与IntelliJ配合使用时,我遇到很多问题。这个问题,以及我在下面的回答,是为将来可能遇到此问题的其他任何人(和我自己的参考)记录如何做到这一点: 问题答案: IntelliJ IDEA 14 EAP 现在提供了对GWT Super Dev Mode的改进支持。您将需要使用JetBrains IDE插件在Chrome上进行JavaScript调试,然后安装GW

  • 问题内容: 我正在使用大猩猩架构根据用户的表单提交来填充结构。我的结构包含,并且我目前收到以下错误: 如何在要使用大猩猩架构填充的结构中使用? 问题答案: 我创建了一个要点(https://gist.github.com/carbocation/51b55297702c7d30d3ef),它显示了解决此问题的一种方法。您需要为以下四种类型的每一种创建一个:sql.NullString,sql.Nu

  • 问题内容: 我试图将Python 3程序反向移植到2.7,但遇到了一个奇怪的问题: 根据文档,返回Unicode文本的内存流。当我尝试手动输入Unicode字符串时,它可以正常工作。为什么即使所有写入的字符串都是Unicode字符串,它也无法与模块结合使用?在什么地方来,它使得异常? (我知道我可以代替使用,但是我想知道在这种情况下怎么了) 问题答案: Python 2.7模块不支持Unicode