Я прочитал о Единица работы шаблон проектирования предприятия из известной книги Мартина Фаулера, и у меня есть несколько вопросов:
Автор говорит, что этот шаблон должен:
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