UnitOfWork模式如何帮助解决并发问题?

时间:2019-10-03 15:30:41

标签: java hibernate persistence unit-of-work

我从马丁·福勒(Martin Fowler)着名的书中了解了工作单元企业设计模式,我有几个问题:

作者说,此模式需要:
1.避免冗余数据库通信(很明显)
2.解决并发问题

问题:

  1. 实际上,我不知道此模式如何帮助解决并发问题。你能解释一下吗?

  2. 我应该为每个实体类或每个应用程序的每个实体对象或单例实例创建UoW实例吗?

UoW书中的一个示例如下所示:

class UnitOfWork ....

    private List newObjects = new ArrayList();
    private List dirtyObjects = new ArrayList();
    private List removedObjects = new ArrayList();


    public void registerNew(DomainObject o){...}
    public void registerDirty(DomainObject o){...}
    public void registerRemoved(DomainObject o){...}
    public void registerClean(DomainObject o){...}

这里看起来单个UoW负责某些对象

但是在另一个示例中:

class UnitOfWorkServlet ...
   final protected void doGet(HttpServletRequest request,HttpServletResponse response){
      try{
         UnitOfWork.newCurrent(); // create UnitOfWorkInstance in ThreadLocal
         handleGet(request, response);
         UnitOfWork.getCurrent().commit() 
      } finally(){
         UnitOfWork.setCurrent(null) //threadLocalInstance.set(null)
      }
   }

在这里,我们为每个Get请求创建一个新的UoW实例,看起来每个请求都与另一个请求隔离。如何解决并发问题?

假设我们有2个相关实体:客户和订单。我们应该创建两个不同的UnitOfWork实例,还是应该使用两个实体的单个实例?


作者声明我们必须将UoF实例存储在ThreadLocal中,以免造成灾难,但我不明白为什么。他在说什么?

比方说,我们有2个来自UI的同时请求,但它们都更新了数据库中的Client字段。您能否解释这种要求的行为?应该创建多少个UoF工程以及如何解决并发问题?

P.S。

我大多数都是Java经验的人,所以如果您的答案可以解释基于JPA / Hibernate的内容,对我来说还可以

0 个答案:

没有答案