|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
Добрался до UnitOfWork. Понятно, что этот паттерн для того чтобы избежать лишних обращений к базе. Когда транзакция закончилась тогда подсчитали изменения и записали их. тут всё вроде понятно. Что не понятно: 1. сколько инстансов объекта UnitOfWork нужно? В одном примере его имплементация выглядит как: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
создаётся впечатление, что это какой-то глобальный объект В другом примере вот такой код(с примером реестра в ThreadLocal): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Тут на каждый запрос UnitOfWor заново создаётся. 2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается. Вот есть у нас 2 конкурентных запроса, которые одного юзера изменяют. Что будет происходить? как этот паттерн поможет решить проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 19:34 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
Он не решит эту проблему. Просто все изменения запишутся в одном месте, транзакционно. Кто первый встал того и тапки. Нужно понимать что книга писалась, когда @transactional только появлялся. Далее, хибернейт со своим первым уровнем кэша классический образец unit of work. Вопрос про инстансы некорректный, на каждый реквест свой юнит оф ворк ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 20:05 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
забыл ник, А зачем ThreadLocal в последнем примере? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 21:36 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerзабыл ник, А зачем ThreadLocal в последнем примере? Ну вспомни что ты спрашивал в прошлой теме про хибернейт и тредлокал в прошлой теме. Поинт юнит оф вопк в том что он либо весь пройдет, либо ничего. В отсутствии его у тебя в базе может очутиться все что угодно ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 22:32 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questioner, JPA PersistenceContext это реализация Фаулеровского UnitOfWork. По сути эта три коллекции объектов: добавленные, измененные, удаленные. Синхронизация состояния PersistenceContext с базой данных происходит в трех случаях (по моему): 1. Commit транзакции 2. Перед выполнением запросов 3. Session.flush (или аналог в JPA) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 22:54 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
забыл никНу вспомни что ты спрашивал в прошлой теме про хибернейт и тредлокал в прошлой теме. Так по такой логике надо любой несинхронизованный объект класть в ThreadLocal. мы ж не кладём любой ArrayList в ThreadLocal. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 11:26 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
забыл ник Поинт юнит оф вопк в том что он либо весь пройдет, либо ничего. В отсутствии его у тебя в базе может очутиться все что угодно Такого кстати никто кроме Вас не пишет. Ну и самое главное, что Фаулер такого не пишет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 13:27 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
Вот есть у нас Client и Order и они связаны. Для Client и для Order будут разные UnitOfWork или одна и та же? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 14:33 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questioner1. сколько инстансов объекта UnitOfWork нужно? я не понял, почему тебя интересует теория и не интересует РЕАЛИЗАЦИЯ? 1. Есть паттерн. 2. Где он реализован? Ответ - Готовые решения из различных ORM - NHibernate (Session), Linq2Sql (DataContext) , Entity Framework (ObjectContext), LLBLGen (UnitOfWork) и т.д. ... Значит учи реализацию в хибере. questioner2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается. Изучай в реализации. Без этого невозможно. Увы(. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:06 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
PetroNotC Sharpquestioner1. сколько инстансов объекта UnitOfWork нужно? я не понял, почему тебя интересует теория и не интересует РЕАЛИЗАЦИЯ? 1. Есть паттерн. 2. Где он реализован? Ответ - Готовые решения из различных ORM - NHibernate (Session), Linq2Sql (DataContext) , Entity Framework (ObjectContext), LLBLGen (UnitOfWork) и т.д. ... Давай я тебе отвечу один раз и ты мне этот вопрос задавать не будешь: Я читаю общепризнанную книгу, пытаюсь переварить. там по идее должны быть максимально краткие и понятные примеры. Автор предполагает, что их должно быть достаточно, но мне не достаточно) поэтому задаю вопросы. по списку готовых решений ты палишься, "джавист") PetroNotC Sharpquestioner2. Также автор пишет, что этот паттерн как-то решать проблемы параллелизма. Вот я не понимаю как она решается. Изучай в реализации. Без этого невозможно. Увы(. ты хотел сказать, что ты не знаешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:19 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
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 и т.п.) Это определяется границами твоей бизнес транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:24 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerЯ читаю общепризнанную книгу, пытаюсь переварить. там по идее должны быть максимально краткие и понятные примеры. Автор предполагает, что их должно быть достаточно, но мне не достаточно) поэтому задаю вопросы. Дак ты хоть 200 раз повтори что ты изучаешь книгу по программированию без программирования. Толку то? questionerты хотел сказать, что ты не знаешь? я изучал хибер в иклипсе))) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:26 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerпо списку готовых решений ты палишься, "джавист")ты решил что я EF не изучал? Или что паттерн относится только к Java? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:30 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
PetroNotC Sharpя изучал хибер в иклипсе))) Вижу, что отложилось много PetroNotC Sharpты решил что я EF не изучал? Или что паттерн относится только к Java? English First ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:36 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
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 инстанса. В каждом инстансе трекаем изменения своего запроса для обоих объектов. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:40 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerВижу, что отложилось много у тебя без практики вообще ничего не откладывается. Увы. Называй реализации паттерна. Что замолчл? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:42 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
PetroNotC SharpquestionerВижу, что отложилось много у тебя без практики вообще ничего не откладывается. Увы. Называй реализации паттерна. Что замолчл? Избавь меня от своего внимания. я его не достоин. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:45 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerОк, нам пришло 2 параллельных запроса на на обновление ордеров юзера. в разных сессиях хибера дорогой ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:46 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerИзбавь меня от своего внимания. я его не достоин.не задавай вопросы джуна без кода ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:46 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
PetroNotC SharpquestionerИзбавь меня от своего внимания. я его не достоин.не задавай вопросы джуна без кода джун у тебя между ног ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:47 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerОк, нам пришло 2 параллельных запроса на на обновление ордеров юзера. на каждый запрос создали по UnitOfWork - то есть 2 инстанса. В каждом инстансе трекаем изменения своего запроса для обоих объектов. Так? Сложно обсуждать абстрактные примеры. Если у тебя две разные транзакции, то у каждой будет своя session (свой кэш), и свои экземпляры (java объекты в памяти). Если в БД это одна и та же запись, то тут уже нужно использовать optimistic\pessimistic lock. Либо в многопользовательской среде данные одного из обновлений можно потерять. Это у тебя будет одна из следующих глав Фаулера. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 15:54 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
vas0questionerОк, нам пришло 2 параллельных запроса на на обновление ордеров юзера. на каждый запрос создали по UnitOfWork - то есть 2 инстанса. В каждом инстансе трекаем изменения своего запроса для обоих объектов. Так? Сложно обсуждать абстрактные примеры. Если у тебя две разные транзакции, то у каждой будет своя session (свой кэш), и свои экземпляры (java объекты в памяти). Если в БД это одна и та же запись, то тут уже нужно использовать optimistic\pessimistic lock. Либо в многопользовательской среде данные одного из обновлений можно потерять. Это у тебя будет одна из следующих глав Фаулера. Мистер Фаулер именно так и делает. Тогда вообще не понятно как этот паттерн помогает решать проблемы конкурентности ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 16:29 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
Я тебе уже написал. Он решает в смысле "либо все либо ничего" и никаких промежуточных состояний. Какое ты решение еще себе представляешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 16:38 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
questionerМистер Фаулер именно так и делает. Тогда вообще не понятно как этот паттерн помогает решать проблемы конкурентности Думаю этот паттерн в конкурентности никак не помогает. Это кэш цель которого уменьшить или отложить выполнение sql запросов к БД, с другой стороны тут возможна оптимизация bulk update. Ну и в конкретных реализациях предотвратить появления в памяти множества java объектов которые соответствуют одной и той же записи в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 16:42 |
|
Фаулер. UnitOfWork
|
|||
---|---|---|---|
#18+
забыл никЯ тебе уже написал. Он решает в смысле "либо все либо ничего" и никаких промежуточных состояний. Какое ты решение еще себе представляешь? Фаулер вообще ничего такого не упоминает. гугл ничего такого не выдаёт тоже. Поэтому я думаю, что Ваше понимание неверно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2019, 16:55 |
|
|
start [/forum/topic.php?fid=59&msg=39871403&tid=2121081]: |
0ms |
get settings: |
4ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
139ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
486ms |
get tp. blocked users: |
1ms |
others: | 316ms |
total: | 957ms |
0 / 0 |