Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Фаулер. UnitOfWork / 25 сообщений из 38, страница 1 из 2
03.10.2019, 19:34
    #39871351
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
Добрался до UnitOfWork.
Понятно, что этот паттерн для того чтобы избежать лишних обращений к базе. Когда транзакция закончилась тогда подсчитали изменения и записали их. тут всё вроде понятно.

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

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

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 конкурентных запроса, которые одного юзера изменяют. Что будет происходить? как этот паттерн поможет решить проблему?
...
Рейтинг: 0 / 0
03.10.2019, 20:05
    #39871365
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
Он не решит эту проблему. Просто все изменения запишутся в одном месте, транзакционно. Кто первый встал того и тапки. Нужно понимать что книга писалась, когда @transactional только появлялся.
Далее, хибернейт со своим первым уровнем кэша классический образец unit of work.
Вопрос про инстансы некорректный, на каждый реквест свой юнит оф ворк
...
Рейтинг: 0 / 0
03.10.2019, 21:36
    #39871383
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
забыл ник,

А зачем ThreadLocal в последнем примере?
...
Рейтинг: 0 / 0
03.10.2019, 22:32
    #39871401
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerзабыл ник,

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


Поинт юнит оф вопк в том что он либо весь пройдет, либо ничего. В отсутствии его у тебя в базе может очутиться все что угодно
...
Рейтинг: 0 / 0
03.10.2019, 22:54
    #39871403
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questioner,

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

Синхронизация состояния PersistenceContext с базой данных происходит в трех случаях (по моему):
1. Commit транзакции
2. Перед выполнением запросов
3. Session.flush (или аналог в JPA)
...
Рейтинг: 0 / 0
04.10.2019, 11:26
    #39871526
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
забыл никНу вспомни что ты спрашивал в прошлой теме про хибернейт и тредлокал в прошлой теме.


Так по такой логике надо любой несинхронизованный объект класть в ThreadLocal. мы ж не кладём любой ArrayList в ThreadLocal.
...
Рейтинг: 0 / 0
04.10.2019, 13:27
    #39871640
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
забыл ник
Поинт юнит оф вопк в том что он либо весь пройдет, либо ничего. В отсутствии его у тебя в базе может очутиться все что угодно

Такого кстати никто кроме Вас не пишет. Ну и самое главное, что Фаулер такого не пишет.
...
Рейтинг: 0 / 0
04.10.2019, 14:33
    #39871685
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
Вот есть у нас Client и Order и они связаны.

Для Client и для Order будут разные UnitOfWork или одна и та же?
...
Рейтинг: 0 / 0
04.10.2019, 15:06
    #39871703
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questioner1. сколько инстансов объекта UnitOfWork нужно?
я не понял, почему тебя интересует теория и не интересует РЕАЛИЗАЦИЯ?
1. Есть паттерн.
2. Где он реализован?
Ответ - Готовые решения из различных ORM - NHibernate (Session), Linq2Sql (DataContext) , Entity Framework (ObjectContext), LLBLGen (UnitOfWork) и т.д.
...
Значит учи реализацию в хибере.
questioner2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается.
Изучай в реализации. Без этого невозможно. Увы(.
...
Рейтинг: 0 / 0
04.10.2019, 15:19
    #39871711
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
PetroNotC Sharpquestioner1. сколько инстансов объекта UnitOfWork нужно?
я не понял, почему тебя интересует теория и не интересует РЕАЛИЗАЦИЯ?
1. Есть паттерн.
2. Где он реализован?
Ответ - Готовые решения из различных ORM - NHibernate (Session), Linq2Sql (DataContext) , Entity Framework (ObjectContext), LLBLGen (UnitOfWork) и т.д.
...


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

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



PetroNotC Sharpquestioner2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается.
Изучай в реализации. Без этого невозможно. Увы(.

ты хотел сказать, что ты не знаешь?
...
Рейтинг: 0 / 0
04.10.2019, 15:24
    #39871714
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
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 и т.п.) Это определяется границами твоей бизнес транзакции.
...
Рейтинг: 0 / 0
04.10.2019, 15:26
    #39871716
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerЯ читаю общепризнанную книгу, пытаюсь переварить. там по идее должны быть максимально краткие и понятные примеры. Автор предполагает, что их должно быть достаточно, но мне не достаточно) поэтому задаю вопросы.
Дак ты хоть 200 раз повтори что ты изучаешь книгу по программированию без программирования.
Толку то?

questionerты хотел сказать, что ты не знаешь?
я изучал хибер в иклипсе)))
...
Рейтинг: 0 / 0
04.10.2019, 15:30
    #39871718
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerпо списку готовых решений ты палишься, "джавист")ты решил что я EF не изучал? Или что паттерн относится только к Java?
...
Рейтинг: 0 / 0
04.10.2019, 15:36
    #39871719
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
PetroNotC Sharpя изучал хибер в иклипсе)))

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

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


English First ?
...
Рейтинг: 0 / 0
04.10.2019, 15:40
    #39871720
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
vas0questionerВот есть у нас 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 инстанса. В каждом инстансе трекаем изменения своего запроса для обоих объектов. Так?
...
Рейтинг: 0 / 0
04.10.2019, 15:42
    #39871722
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerВижу, что отложилось много
у тебя без практики вообще ничего не откладывается. Увы.
Называй реализации паттерна. Что замолчл?
...
Рейтинг: 0 / 0
04.10.2019, 15:45
    #39871724
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
PetroNotC SharpquestionerВижу, что отложилось много
у тебя без практики вообще ничего не откладывается. Увы.
Называй реализации паттерна. Что замолчл?

Избавь меня от своего внимания. я его не достоин.
...
Рейтинг: 0 / 0
04.10.2019, 15:46
    #39871725
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerОк, нам пришло 2 параллельных запроса на на обновление ордеров юзера.
в разных сессиях хибера дорогой
...
Рейтинг: 0 / 0
04.10.2019, 15:46
    #39871726
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerИзбавь меня от своего внимания. я его не достоин.не задавай вопросы джуна без кода
...
Рейтинг: 0 / 0
04.10.2019, 15:47
    #39871727
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
PetroNotC SharpquestionerИзбавь меня от своего внимания. я его не достоин.не задавай вопросы джуна без кода

джун у тебя между ног
...
Рейтинг: 0 / 0
04.10.2019, 15:54
    #39871733
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerОк, нам пришло 2 параллельных запроса на на обновление ордеров юзера.

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

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

Это у тебя будет одна из следующих глав Фаулера.
...
Рейтинг: 0 / 0
04.10.2019, 16:29
    #39871759
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
vas0questionerОк, нам пришло 2 параллельных запроса на на обновление ордеров юзера.

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

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

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

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

Тогда вообще не понятно как этот паттерн помогает решать проблемы конкурентности
...
Рейтинг: 0 / 0
04.10.2019, 16:38
    #39871760
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
Я тебе уже написал. Он решает в смысле "либо все либо ничего" и никаких промежуточных состояний. Какое ты решение еще себе представляешь?
...
Рейтинг: 0 / 0
04.10.2019, 16:42
    #39871763
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
questionerМистер Фаулер именно так и делает.

Тогда вообще не понятно как этот паттерн помогает решать проблемы конкурентности Думаю этот паттерн в конкурентности никак не помогает. Это кэш цель которого уменьшить или отложить выполнение sql запросов к БД, с другой стороны тут возможна оптимизация bulk update. Ну и в конкретных реализациях предотвратить появления в памяти множества java объектов которые соответствуют одной и той же записи в БД.
...
Рейтинг: 0 / 0
04.10.2019, 16:55
    #39871774
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фаулер. UnitOfWork
забыл никЯ тебе уже написал. Он решает в смысле "либо все либо ничего" и никаких промежуточных состояний. Какое ты решение еще себе представляешь?

Фаулер вообще ничего такого не упоминает. гугл ничего такого не выдаёт тоже. Поэтому я думаю, что Ваше понимание неверно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Фаулер. UnitOfWork / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]