Как шаблоны UnitOfWork помогают решать параллельные проблемы? - PullRequest
0 голосов
/ 03 октября 2019

Я прочитал о Единица работы шаблон проектирования предприятия из известной книги Мартина Фаулера, и у меня есть несколько вопросов:

Автор говорит, что этот шаблон должен:
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)
      }
   }

Здесь мы создаем новый экземпляр UoW для каждого запроса Get и выглядим так, как будто каждый запрос изолирован от другого. Как это может решить параллельные вопросы?

Допустим, у нас есть 2 связанных объекта: клиент и заказ. Должны ли мы создавать 2 разных экземпляра UnitOfWork или использовать один экземпляр для обеих сущностей?


Автор заявляет, что мы должны хранить экземпляр UoF в ThreadLocal, чтобы избежать катастрофы, но я не понял, почему. О чем он говорит?

Допустим, у нас есть 2 разных одновременных запроса от пользовательского интерфейса, но оба они обновляют списки клиентов в базе данных. не могли бы вы объяснить поведение таких запросов? Сколько работ UoF должно быть создано и как они решают параллельные проблемы?

PS

Я в основном знаком с java, поэтому для меня нормально, если ваши ответы объяснят вещи, основанные на JPA / Hibernate

...