Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
Добрался до UnitOfWork.
Понятно, что этот паттерн для того чтобы избежать лишних обращений к базе. Когда транзакция закончилась тогда подсчитали изменения и записали их. тут всё вроде понятно.

Что не понятно:

1. сколько инстансов объекта UnitOfWork нужно?

В одном примере его имплементация выглядит как:

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){...}


создаётся впечатление, что это какой-то глобальный объект

В другом примере вот такой код(с примером реестра в ThreadLocal):

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)
      }
   }


Тут на каждый запрос UnitOfWor заново создаётся.



2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается.

Вот есть у нас 2 конкурентных запроса, которые одного юзера изменяют. Что будет происходить? как этот паттерн поможет решить проблему?
3 окт 19, 19:34    [21986217]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
Он не решит эту проблему. Просто все изменения запишутся в одном месте, транзакционно. Кто первый встал того и тапки. Нужно понимать что книга писалась, когда @transactional только появлялся.
Далее, хибернейт со своим первым уровнем кэша классический образец unit of work.
Вопрос про инстансы некорректный, на каждый реквест свой юнит оф ворк
3 окт 19, 20:05    [21986243]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
забыл ник,

А зачем ThreadLocal в последнем примере?
3 окт 19, 21:36    [21986283]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
questioner
забыл ник,

А зачем ThreadLocal в последнем примере?

Ну вспомни что ты спрашивал в прошлой теме про хибернейт и тредлокал в прошлой теме.


Поинт юнит оф вопк в том что он либо весь пройдет, либо ничего. В отсутствии его у тебя в базе может очутиться все что угодно
3 окт 19, 22:32    [21986311]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
questioner,

JPA PersistenceContext это реализация Фаулеровского UnitOfWork. По сути эта три коллекции объектов: добавленные, измененные, удаленные.

Синхронизация состояния PersistenceContext с базой данных происходит в трех случаях (по моему):
1. Commit транзакции
2. Перед выполнением запросов
3. Session.flush (или аналог в JPA)
3 окт 19, 22:54    [21986319]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
забыл ник
Ну вспомни что ты спрашивал в прошлой теме про хибернейт и тредлокал в прошлой теме.


Так по такой логике надо любой несинхронизованный объект класть в ThreadLocal. мы ж не кладём любой ArrayList в ThreadLocal.
4 окт 19, 11:26    [21986546]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
забыл ник

Поинт юнит оф вопк в том что он либо весь пройдет, либо ничего. В отсутствии его у тебя в базе может очутиться все что угодно


Такого кстати никто кроме Вас не пишет. Ну и самое главное, что Фаулер такого не пишет.
4 окт 19, 13:27    [21986702]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
Вот есть у нас Client и Order и они связаны.

Для Client и для Order будут разные UnitOfWork или одна и та же?
4 окт 19, 14:33    [21986781]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
questioner
1. сколько инстансов объекта UnitOfWork нужно?

я не понял, почему тебя интересует теория и не интересует РЕАЛИЗАЦИЯ?
1. Есть паттерн.
2. Где он реализован?
Ответ - Готовые решения из различных ORM - NHibernate (Session), Linq2Sql (DataContext) , Entity Framework (ObjectContext), LLBLGen (UnitOfWork) и т.д.
...
Значит учи реализацию в хибере.
questioner
2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается.

Изучай в реализации. Без этого невозможно. Увы(.
4 окт 19, 15:06    [21986819]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
PetroNotC Sharp
questioner
1. сколько инстансов объекта UnitOfWork нужно?

я не понял, почему тебя интересует теория и не интересует РЕАЛИЗАЦИЯ?
1. Есть паттерн.
2. Где он реализован?
Ответ - Готовые решения из различных ORM - NHibernate (Session), Linq2Sql (DataContext) , Entity Framework (ObjectContext), LLBLGen (UnitOfWork) и т.д.
...


Давай я тебе отвечу один раз и ты мне этот вопрос задавать не будешь:
Я читаю общепризнанную книгу, пытаюсь переварить. там по идее должны быть максимально краткие и понятные примеры. Автор предполагает, что их должно быть достаточно, но мне не достаточно) поэтому задаю вопросы.

по списку готовых решений ты палишься, "джавист")



PetroNotC Sharp
questioner
2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается.

Изучай в реализации. Без этого невозможно. Увы(.


ты хотел сказать, что ты не знаешь?
4 окт 19, 15:19    [21986832]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
questioner
Вот есть у нас Client и Order и они связаны.

Для Client и для Order будут разные UnitOfWork или одна и та же?
Подход JPA (и hibernate) отличается от JDBC. В JDBC ты выполняешь запрос и идет обращение к БД.

В JPA PersistenceContext (Hibernate Session) это абстракция его еще называют кэш первого уровня.

Например у тебя есть строка в БД, ты получил запросом java объект в памяти.

Person person = session.find(1L);
person.setName("Updated name");

после вызова setter, состояние твоего объекта не соответствует тому что в БД. Поэтому состояние кеша первого уровня должно быть синхронизовано с БД. За это как раз этот кэш и отвечает. Для всех измененных в кэше объектов будет вызван sql update, для удаленных sql delete, для новых объектов sql insert.

Объекты в этом кэше могут быть любые (Client, Order и т.п.) Это определяется границами твоей бизнес транзакции.
4 окт 19, 15:24    [21986837]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
questioner
Я читаю общепризнанную книгу, пытаюсь переварить. там по идее должны быть максимально краткие и понятные примеры. Автор предполагает, что их должно быть достаточно, но мне не достаточно) поэтому задаю вопросы.

Дак ты хоть 200 раз повтори что ты изучаешь книгу по программированию без программирования.
Толку то?

questioner
ты хотел сказать, что ты не знаешь?

я изучал хибер в иклипсе)))
4 окт 19, 15:26    [21986842]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
questioner
по списку готовых решений ты палишься, "джавист")
ты решил что я EF не изучал? Или что паттерн относится только к Java?
4 окт 19, 15:30    [21986846]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
PetroNotC Sharp
я изучал хибер в иклипсе)))


Вижу, что отложилось много

PetroNotC Sharp
ты решил что я EF не изучал? Или что паттерн относится только к Java?


English First ?
4 окт 19, 15:36    [21986851]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
vas0
questioner
Вот есть у нас Client и Order и они связаны.

Для Client и для Order будут разные UnitOfWork или одна и та же?
Подход JPA (и hibernate) отличается от JDBC. В JDBC ты выполняешь запрос и идет обращение к БД.

В JPA PersistenceContext (Hibernate Session) это абстракция его еще называют кэш первого уровня.

Например у тебя есть строка в БД, ты получил запросом java объект в памяти.

Person person = session.find(1L);
person.setName("Updated name");

после вызова setter, состояние твоего объекта не соответствует тому что в БД. Поэтому состояние кеша первого уровня должно быть синхронизовано с БД. За это как раз этот кэш и отвечает. Для всех измененных в кэше объектов будет вызван sql update, для удаленных sql delete, для новых объектов sql insert.

Объекты в этом кэше могут быть любые (Client, Order и т.п.) Это определяется границами твоей бизнес транзакции.


Ок, нам пришло 2 параллельных запроса на на обновление ордеров юзера.

на каждый запрос создали по UnitOfWork - то есть 2 инстанса. В каждом инстансе трекаем изменения своего запроса для обоих объектов. Так?
4 окт 19, 15:40    [21986854]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
questioner
Вижу, что отложилось много

у тебя без практики вообще ничего не откладывается. Увы.
Называй реализации паттерна. Что замолчл?
4 окт 19, 15:42    [21986857]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
PetroNotC Sharp
questioner
Вижу, что отложилось много

у тебя без практики вообще ничего не откладывается. Увы.
Называй реализации паттерна. Что замолчл?


Избавь меня от своего внимания. я его не достоин.
4 окт 19, 15:45    [21986860]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
questioner
Ок, нам пришло 2 параллельных запроса на на обновление ордеров юзера.

в разных сессиях хибера дорогой
4 окт 19, 15:46    [21986861]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
questioner
Избавь меня от своего внимания. я его не достоин.
не задавай вопросы джуна без кода
4 окт 19, 15:46    [21986863]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
PetroNotC Sharp
questioner
Избавь меня от своего внимания. я его не достоин.
не задавай вопросы джуна без кода


джун у тебя между ног
4 окт 19, 15:47    [21986864]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
questioner
Ок, нам пришло 2 параллельных запроса на на обновление ордеров юзера.

на каждый запрос создали по UnitOfWork - то есть 2 инстанса. В каждом инстансе трекаем изменения своего запроса для обоих объектов. Так?
Сложно обсуждать абстрактные примеры. Если у тебя две разные транзакции, то у каждой будет своя session (свой кэш), и свои экземпляры (java объекты в памяти).

Если в БД это одна и та же запись, то тут уже нужно использовать optimistic\pessimistic lock. Либо в многопользовательской среде данные одного из обновлений можно потерять.

Это у тебя будет одна из следующих глав Фаулера.
4 окт 19, 15:54    [21986872]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
vas0
questioner
Ок, нам пришло 2 параллельных запроса на на обновление ордеров юзера.

на каждый запрос создали по UnitOfWork - то есть 2 инстанса. В каждом инстансе трекаем изменения своего запроса для обоих объектов. Так?
Сложно обсуждать абстрактные примеры. Если у тебя две разные транзакции, то у каждой будет своя session (свой кэш), и свои экземпляры (java объекты в памяти).

Если в БД это одна и та же запись, то тут уже нужно использовать optimistic\pessimistic lock. Либо в многопользовательской среде данные одного из обновлений можно потерять.

Это у тебя будет одна из следующих глав Фаулера.


Мистер Фаулер именно так и делает.

Тогда вообще не понятно как этот паттерн помогает решать проблемы конкурентности
4 окт 19, 16:29    [21986911]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
Я тебе уже написал. Он решает в смысле "либо все либо ничего" и никаких промежуточных состояний. Какое ты решение еще себе представляешь?
4 окт 19, 16:38    [21986917]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
questioner
Мистер Фаулер именно так и делает.

Тогда вообще не понятно как этот паттерн помогает решать проблемы конкурентности
Думаю этот паттерн в конкурентности никак не помогает. Это кэш цель которого уменьшить или отложить выполнение sql запросов к БД, с другой стороны тут возможна оптимизация bulk update. Ну и в конкретных реализациях предотвратить появления в памяти множества java объектов которые соответствуют одной и той же записи в БД.
4 окт 19, 16:42    [21986922]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер. UnitOfWork  [new]
questioner
Member

Откуда:
Сообщений: 1861
забыл ник
Я тебе уже написал. Он решает в смысле "либо все либо ничего" и никаких промежуточных состояний. Какое ты решение еще себе представляешь?


Фаулер вообще ничего такого не упоминает. гугл ничего такого не выдаёт тоже. Поэтому я думаю, что Ваше понимание неверно.
4 окт 19, 16:55    [21986937]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить