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

Откуда:
Сообщений: 1861
Решил добраться до классики и прочитать книжку Фаулера про архитектуру.

Читаю про Реестр(Registry)

В книге второй пример про реестр уникальный в рамках потока и в конце вот такой вот код приведён:

try{
    ThreadLocalRegistry.begin(); //создание ThreadLocalRegistry инстанса и помещение его в ThreadLocal
    PersonFinder f1 = ThreadLocalRegistry.personFinder();
    Person martin = Registry.personFinder().find(1)
    ThreadLocalRegistry.end();//удаление ThreadLocalRegistry инстанса из ThreadLocal
}


Не могу понять что хотел сказать автор.
Как связаны строчки
PersonFinder f1 = ThreadLocalRegistry.personFinder();

и
Person martin = Registry.personFinder().find(1)
20 сен 19, 14:06    [21975302]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
chpasha
Member

Откуда:
Сообщений: 8441
скорее всего ошибка в примере с учетом того, что f1 нигде ниже не используется
20 сен 19, 14:44    [21975360]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

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

А что должно быть?
20 сен 19, 20:25    [21975721]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
chpasha
Member

Откуда:
Сообщений: 8441
questioner
А что должно быть?

чую в вопросе какой-то подвох ибо вроде ж очевидно, что либо f1.find(1) либо ThreadLocalRegistry.personFinder().find(1)
20 сен 19, 21:38    [21975758]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
mayton
Member

Откуда: loopback
Сообщений: 42386
questioner,

Это точно Фаулер писал?
21 сен 19, 17:11    [21976016]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
chpasha
Member

Откуда:
Сообщений: 8441
mayton
Это точно Фаулер писал?

да, можно нагуглить этот кусок
21 сен 19, 17:26    [21976019]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

Откуда:
Сообщений: 1861
В книге сказано, что каждый вызов надо оборачивать в
try{
    ThreadLocalRegistry.begin(); //создание ThreadLocalRegistry инстанса и помещение его в ThreadLocal
    ...
}  finally{
   ThreadLocalRegistry.end();//удаление ThreadLocalRegistry инстанса из ThreadLocal
}

А честно я вообще не понял зачем каждый раз ThreadLocalRegistry добавлять и удалять при взаимодействии с ним?


P.S. В изначальном примере небольшая неточночность ThreadLocalRegistry.end(); должно быть в finally блоке
23 сен 19, 13:28    [21976800]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
chpasha
Member

Откуда:
Сообщений: 8441
questioner
А честно я вообще не понял зачем каждый раз ThreadLocalRegistry добавлять и удалять при взаимодействии с ним?

предположительно в качестве примера экономии ресурсов
23 сен 19, 14:09    [21976846]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

Откуда:
Сообщений: 1861
нашёл список ошибок книги(о_О как их много):
https://www.martinfowler.com/eaaErrata.htm

автор
Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]


chpasha
предположительно в качестве примера экономии ресурсов



я так понял суть Registry в том, чтобы мы могли обратиться отовсюду к объекту. Глобальный объект по сути.

Тут вообще получается какая-то фабрика, которая каждый раз создаёт объект и каждый раз мы этот объект ещё и удаляем и ещё и используем ThreadLocal для хранения регистра. Сомнительная экономия какая-то
24 сен 19, 12:12    [21977724]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
забыл ник
Member

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

Тут вообще получается какая-то фабрика, которая каждый раз создаёт объект и каждый раз мы этот объект ещё и удаляем и ещё и используем ThreadLocal для хранения регистра. Сомнительная экономия какая-то


1) ThreadLocal держит ссылку на персонфайндер и он не может быть собран GC(если поток бесконечно работает в пуле)
2) Так как поток работает в пуле, то он может шариться между разными клиентами, что есть очевидно неправильно. Поэтому был изобретен этот паттерн

----> request started
----> get thread from pool
val a = getFromThreadLocal
method1() ---> use a inside
method2() ---> use a inside
method3() ---> use a inside
cleanThreadLocal
----> return to the pool
24 сен 19, 12:29    [21977754]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

Откуда:
Сообщений: 1861
забыл ник
1) ThreadLocal держит ссылку на персонфайндер и он не может быть собран GC(если поток бесконечно работает в пуле)


ThreadLocal содержит ссылку на ThreadLocalRegistry, а тот уже в свою очередь на PersonFinder

автор
2) Так как поток работает в пуле, то он может шариться между разными клиентами, что есть очевидно неправильно. Поэтому был изобретен этот паттерн


А что неправильно в том, что поток работает в пуле? или в том, что он может использоваться разными клиентами?
24 сен 19, 13:25    [21977857]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
chpasha
Member

Откуда:
Сообщений: 8441
questioner
я так понял суть Registry в том, чтобы мы могли обратиться отовсюду к объекту. Глобальный объект по сути.
это ж идея + пример. идею можно модифицировать - в данном случае он решил, что ему для реализации задачи нужны контекст-синглтоны, т.е. экземпляры уникальные только в пределах какого-то контекста/области (в данном случае потока). Как например session scope в spring.

questioner
что он может использоваться разными клиентами?

предположу, что из-за наличия какого-то внутреннего состояния. возможно коллега еще какие-то моменты имел в виду.
24 сен 19, 14:14    [21977939]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

Откуда:
Сообщений: 1861
Чот всё равно не очень понятно.

Где-то слышал, что hibernate хранит то ли коннекшн, то ли что в ThreadLocal и это вроде как пример паттерна Registry.
Кто-то может подробнее рассказать?
26 сен 19, 11:42    [21979596]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
chpasha
Member

Откуда:
Сообщений: 8441
questioner
ThreadLocal и это вроде как пример паттерна Registry

этот паттерн не имеет никакого отношения к ThreadLocal, все это уже детали реализации.
26 сен 19, 12:06    [21979629]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
mayton
Member

Откуда: loopback
Сообщений: 42386
questioner, ThreadLocal это сущность мира JDK. Паттерн "Реестр" - более общий.
26 сен 19, 12:16    [21979649]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
chpasha
questioner
ThreadLocal и это вроде как пример паттерна Registry

этот паттерн не имеет никакого отношения к ThreadLocal, все это уже детали реализации.
+1
Весь топик высосан из пальца.
- приводится пример паттерна с защитой от потоков. А нужно было разобрать сам паттерн.
- что такое finder наверняка есть в книге откуда взял код.
- убери потоки и разбери паттерн рядом с синглетоном.
26 сен 19, 12:21    [21979662]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

Откуда:
Сообщений: 1861
mayton
questioner, ThreadLocal это сущность мира JDK. Паттерн "Реестр" - более общий.


Я понимаю это. С другой стороны Registry через ThreadLocal используется в хибернейт. Не 100 процентов, но я почти уверен. На примере из книги не понятно так как суть проблемы не ясна. Вот думаю, если кто-то сможет обьяснить на примере знакомой технологии, то будет понятно. Для чего в хибернейт так сделали и что это дает?
26 сен 19, 12:47    [21979699]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
vas0
Member

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

Свое мнение выскажу. Но чтобы долго не расписывать, тезисно.

Шаблон Registry это просто CRUD + Finder-methods (просто DAO). В Spring это аннотация @Registry.

Hibernate это просто реализация ORM, но в свое время у их команды была попытка стать нечто большим (скорее даже их жизнь заставила). Нужен не только маппинг, но и какие то задатки контейнера (lookup методы для поиска нужного Registry). Для того чтобы hibernate мог работать без контейнеров (аля Spring). В свое был небольшой срач между членами команд RedHat и Spring. Суть претензии была в том что интеграция spring-hibernate была реализована не по феншую, и что так работать с hibernate как это сделали в spring неверно. На мой взгляд там была некая ревность: Мы реализуем стандарты, а вы своими подходами губите нам весь J2EE. Но пользователи этого не оценили.

Вообщем отсутствие IoC контейнера, в тех окружениях где его нет, предполагает добавление каких то костылей, и ThreadLocal (для поиска Registry) это один из вариантов таких костылей.
26 сен 19, 13:25    [21979736]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
questioner,
Ты сам придумал что в хибере это есть и теперь лбом в стену.
Обсуждай отдельно. Или потоки или шаблон или хибер.
Хибер не потокобезопасен. И гарантируют только межсиссионную изоляцию.
Намешал все подряд.
26 сен 19, 13:33    [21979749]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

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

vas0
Шаблон Registry это просто CRUD + Finder-methods (просто DAO). В Spring это аннотация @Registry.


по запросу spring @Registry annotation гугл ничего релевантного не выдаёт
26 сен 19, 13:44    [21979774]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

Откуда:
Сообщений: 1861
PetroNotC Sharp,

фуск
Ты сам придумал что в хибере это есть и теперь лбом в стену.

Хибернейт ничего не хранит в ThreadLocal ?
26 сен 19, 13:52    [21979789]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
vas0
Member

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

vas0
Шаблон Registry это просто CRUD + Finder-methods (просто DAO). В Spring это аннотация @Registry.


по запросу spring @Registry annotation гугл ничего релевантного не выдаёт
Я думаю я тут напутал. Я подумал по коду что раз есть find методы то речь идет про DAO. В спринге это @Repository.

Фаулеровкий Registry это наверно другое. Это наверно аналог поиска компонентов в "мифическом контейнере", когда никакого контейнера нет.
26 сен 19, 14:09    [21979845]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
chpasha
Member

Откуда:
Сообщений: 8441
questioner
Хибернейт ничего не хранит в ThreadLocal ?

он хотел сказать, что ты в первом сообщении признал, что не знаешь, хранит хибер коннекты в threadlocal или нет, но тут же предложил кому-то объяснить, зачем он это делает. во втором - ты заявил, что уже почти на 100% уверен, что хранит. Теперь речь вообще о том, хранит ли Hibernate в ThreadLocal хоть что-нибудь. В threadlocal мы кладем объект либо потому что не можем его сделать потокобезопасным (ну в краткие сроки и чтоб 100% без глюков, вылезающих на 20 процессорах раз в неделю), либо потому что хотим распараллелить его использование. ну например JDBC Connection хоть и потокобезопасен (если по феншую), но имеет при использование одного инстанса параллельно кучу косяков, что лишает его использование совместно всякого смысла. вот тебе возможный вариант почему, ЕСЛИ хибернейт действительно что-то такое делает.
26 сен 19, 14:28    [21979879]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2089
chpasha,
+1 сумбурные кидания из стороны в сторону без цели.
Паттерн, потоки и хибер независимы. Изучай ТС отдельно.
26 сен 19, 14:42    [21979905]     Ответить | Цитировать Сообщить модератору
 Re: Фаулер: паттерн Реестр, уникальный в рамках потока. Что хотел сказать автор?  [new]
questioner
Member

Откуда:
Сообщений: 1861
vas0
questioner
vas0,

пропущено...


по запросу spring @Registry annotation гугл ничего релевантного не выдаёт
Я думаю я тут напутал. Я подумал по коду что раз есть find методы то речь идет про DAO. В спринге это @Repository.

Фаулеровкий Registry это наверно другое. Это наверно аналог поиска компонентов в "мифическом контейнере", когда никакого контейнера нет.


Ну вот да. В потрохах спринга кстати нередко всьречаются и регистры и регистрары
26 сен 19, 14:52    [21979923]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить