|
|
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
ситуация - есть поток А с открытой хиберовской сессией, там создается некоторая сущность, ее айдиха передается в поток Б, а в потоке А сессия еще не закрыта и в итоге поток Б айдишку этой сущности найти не может. что вполне логично. Какой подход лучше тут использовать? передавать айдиху в параллельный поток уже после закрытия транзакции (что сложно) или же можеет как то сделать чтоб второй поток ждал появления айдихи? или что-то третье? и вообще подход у меня неверен в обоих случаях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 19:37 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTКакой подход лучше тут использовать? хибер не потокобезопасен. Какая необходимость кидать данные туду сюда между потоками. Это не любит не только хибер, но все технологии. Не побоюсь этого слова)). - кидай ID в другой поток и там заново Новая сессия и загрузить новый объект по этому ID andreykaTи вообще подход у меня неверен в обоих случаях? неверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 22:35 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTтам создается некоторая сущность, Хибер нужен только сохранить. Поэтому без хибера создал в потоке объекты, поигрался с ними всеми ядрами и потоками, а потом всё в одном потоке передал коллекцией в хибер и сохранил. Иначе зачем тебе потоки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 22:42 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTКакой подход лучше тут использовать? Скорее всего вы неправильно решаете задачу, но я не стану вас уговаривать :) В вашем случае если сущность рид-онли,то можно использовать кэш второго уровня, по-моему он потокобезопасен. Если же вы вытянули сущность в одном потоке, поменяли ее и передав в другой поток хотите работать с измененной версией - то могу вам только пожелать удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:03 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
ну да. согласен. в других местах это решил тем, что в параллельные потоки передавал не ссылку на объект (в контексте хибера и бд - это айдишка на строку в таблице), а копию объекта. где это надо? ну например, у меня произошла какая-то активити в системе, которая породила объект, в фоне есть мешок слушателей, что должны по факту появления этого объекта в системе сделать какие-то свои действия. да, чтоб не париться можно всё это делать в одном потоке. а можно выпендриться и сделать каждому слушателю отдельный поток, ну или пул потоков в котором слушатели сами в очередь выстраются. впрочем, это уже частности. а суть в том - что да, тут приходится задействовать асинхронку, потому, что слушатели сами по себе представляют из себя достаточно тяжелые процессы. в предыдущем проекте где я сидел, там челы особо не парились и всё делали в одном потоке. никаких проблем с дедлоками базы или блокировками (в рамках одной задачи), всё было замечательно до тех пор, пока между реквестом и респонзом с фронта стало проходить по 15 секунд ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:03 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaT где это надо? ну например, у меня произошла какая-то активити в системе, которая породила объект, в фоне есть мешок слушателей, что должны по факту появления этого объекта в системе сделать какие-то свои действия. да, чтоб не париться можно всё это делать в одном потоке. а можно выпендриться и сделать каждому слушателю отдельный поток, ну или пул потоков в котором слушатели сами в очередь выстраются. впрочем, это уже частности. а суть в том - что да, тут приходится задействовать асинхронку, потому, что слушатели сами по себе представляют из себя достаточно тяжелые процессы. Это все замечательно, но к первоначальному вопросу отношения мягко говоря не имеет. Ну и городить пулы тоже не надо, когда есть стандартные проверенные временем брокеры сообщений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:06 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTпока между реквестом и респонзом с фронта стало проходить по 15 секунд придёт третий после тебя и скажет: "ну тут чел и намутил со своей асинхронностью)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:09 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTчелы особо не парились и всё делали в одном потоке. - в одном потоке НЕ тяжёлые задачи. - все тяжёлые в фоновые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:11 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
забыл никandreykaTКакой подход лучше тут использовать? Скорее всего вы неправильно решаете задачу, но я не стану вас уговаривать :) В вашем случае если сущность рид-онли,то можно использовать кэш второго уровня, по-моему он потокобезопасен. Если же вы вытянули сущность в одном потоке, поменяли ее и передав в другой поток хотите работать с измененной версией - то могу вам только пожелать удачи. да все спорные места я перевел на копии объектов. осталось только одно. )) на самом деле, проблема в том, что сущность создается, и вроде как сохраняется (репо возвращает айди сущности), эта айдишка передается в параллельный поток, а поток читая эту сущность из репо получает налл )) т.е. в базе сущности вроде как НЕТ ))) решения с наскока вижу здесь два: передавать айди сущности после закрытия сессии -- работает. и в параллельном потоке каким-то образом ПОДОЖДАТЬ появления этой сущности в базе первый ариант - в рамках спринг приложения, к сожалению, с особенностями работы его АОПа чтоб это делать надо городить какие-то лютые фасады и из одного бина дергать другой, по возврату значения запускать параллельные потоки -- волосатый код. или менять аоп на аспектджей - тогда можно играться транзакциями внутри бина. второй вариант на мой взгляд не менее костыльный ))) я даж не представляю как бы это сделать. на ум приходят какие-нибудь монады, но у меня ума не хватает понять как это всё обставить чтоб без волос получилось. или костыль - засунуть в цикл вайл фолс - еще хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:15 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTзабыл никпропущено... Скорее всего вы неправильно решаете задачу, но я не стану вас уговаривать :) В вашем случае если сущность рид-онли,то можно использовать кэш второго уровня, по-моему он потокобезопасен. Если же вы вытянули сущность в одном потоке, поменяли ее и передав в другой поток хотите работать с измененной версией - то могу вам только пожелать удачи. да все спорные места я перевел на копии объектов. осталось только одно. )) на самом деле, проблема в том, что сущность создается, и вроде как сохраняется (репо возвращает айди сущности), эта айдишка передается в параллельный поток, а поток читая эту сущность из репо получает налл )) т.е. в базе сущности вроде как НЕТ ))) решения с наскока вижу здесь два: передавать айди сущности после закрытия сессии -- работает. и в параллельном потоке каким-то образом ПОДОЖДАТЬ появления этой сущности в базе первый ариант - в рамках спринг приложения, к сожалению, с особенностями работы его АОПа чтоб это делать надо городить какие-то лютые фасады и из одного бина дергать другой, по возврату значения запускать параллельные потоки -- волосатый код. или менять аоп на аспектджей - тогда можно играться транзакциями внутри бина. второй вариант на мой взгляд не менее костыльный ))) я даж не представляю как бы это сделать. на ум приходят какие-нибудь монады, но у меня ума не хватает понять как это всё обставить чтоб без волос получилось. или костыль - засунуть в цикл вайл фолс - еще хуже. wtf?? Почему бы просто не закомитить транзакцию? Вы как разруливать то собираетесь, если вдруг база нае..рнется с этой вашей асинхронщиной ) Хибернейт не пишет прямо в базу при создании сущности, он делает это либо при закрытии сессии, либо при прямом коммите или flush. В общем ваш подход очень и очень порочен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:23 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTи вроде как сохраняется известный факт, что другие сессии увидят после закрытия сессии этой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:24 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTПОДОЖДАТЬ появления этой сущности в базе если производительность устраивает, то в сущность завести флаг ОчереднойШагОбработки. Потом один поток создаёт и сохраняет. Второй поток периодически сканирует базу и делает второй шаг обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:29 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
Petro123andreykaTчелы особо не парились и всё делали в одном потоке. - в одном потоке НЕ тяжёлые задачи. - все тяжёлые в фоновые. ну вот сделали они в одном потоке отсылку 20 тысяч пуш уведомлений ))) причем, уникальных. а так согласен. к4то ж спорит. у меня ситуация, что есть некий код, который передает айдишку кварцу, который запускает задачу немедленно. естественно в параллельном потоке и запускает ее до того как закрылась транзакция, создавшая эту айдишку. и в один поток вогнать это и нельзя и не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:32 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
Petro123andreykaTПОДОЖДАТЬ появления этой сущности в базе если производительность устраивает, то в сущность завести флаг ОчереднойШагОбработки. Потом один поток создаёт и сохраняет. Второй поток периодически сканирует базу и делает второй шаг обработки. имхо, это примерно так же как цикл крутить с тредслипом в надежде получить наконец значение. в общем, решение имеет место быть но, как то не просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:33 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
Petro123andreykaTПОДОЖДАТЬ появления этой сущности в базе если производительность устраивает, то в сущность завести флаг ОчереднойШагОбработки. Потом один поток создаёт и сохраняет. Второй поток периодически сканирует базу и делает второй шаг обработки. Да все что угодно, главное не сессии хиберовские шарить Вплоть до сериализации энтити в json какой-нить и шлем в мессадж брокер, делов то. Ну это если транзакции не важны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:34 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
забыл никВплоть до сериализации энтити в json какой-нить +1 я не знаю, что он до хибера докопался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:37 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
транзакции в данном контексте не важны. ну в общем. всё верно в моем подходе - слать копии объектов. осталось придумать как сделать в одно движение копию хиберской сущности. хибернейтутилз.копипропертиз не предлагать )) сериализовать в джейсон - тоже не очень удачный вариант (в моем конкретном случае разумеется) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:38 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
забыл никВплоть до сериализации энтити в json какой-нить Ну в пределах одной jvm это перебор. Тут можно и бинарной сериализацией обойтись. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:44 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaT, ну, если из базы доставать, то ты секунды 2 теряешь, зато транзакционность и надёжность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:44 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
а можно ли как то в рамках спринга передать какой-то этакий объект который как футура будет стоять до тех пор пока результат внутри него не появится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:51 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTтранзакции в данном контексте не важны. ну в общем. всё верно в моем подходе - слать копии объектов. осталось придумать как сделать в одно движение копию хиберской сущности. хибернейтутилз.копипропертиз не предлагать )) сериализовать в джейсон - тоже не очень удачный вариант (в моем конкретном случае разумеется) Что там за сущность такая? Вариантов сериализации море, начиная от ручного Externalizable заканчивая Dozer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:52 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
хотя нет глупость написал. сделать то можно но это такие дрова будут что лучше не надо. всё-равно внутри будет что то что будет пытаться прочесть это с базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:54 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTя даж не представляю как бы это сделать. на ум приходят какие-нибудь монады, но у меня ума не хватает понять как это всё обставить чтоб без волос получилось. или костыль - засунуть в цикл вайл фолс - еще хуже. Просто прозреваю как на пустом месте можно такой трешак себе создать . Рискну предположить что вся эта логика решат какую-то тривиальную штучку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:55 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
забыл ник, да ничего особого. создается сущность, передается айдишка сущности в джобу кварца которая немедленно запускается, и джоба что-то там с этой сущностью делает, предварительно прочитав ее из базы (скажем, емейл шлет кому-нибудь). я вот ща подумал - самый дубовый вариант - джобу запускать с задержкой. )) воркэраунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:56 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
maytonandreykaTя даж не представляю как бы это сделать. на ум приходят какие-нибудь монады, но у меня ума не хватает понять как это всё обставить чтоб без волос получилось. или костыль - засунуть в цикл вайл фолс - еще хуже. Просто прозреваю как на пустом месте можно такой трешак себе создать . Рискну предположить что вся эта логика решат какую-то тривиальную штучку... грубо очень грубо созадется некий набор атрибутов для сферической задачи в вакууме и в джобу передается айдишка этого набора атрибутов, по которым потом порождается целый мешок действий и в базе появляется еще мешок сущностей. нет не тривиальный )) все тривиальные я уже пофиксил )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:59 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTmaytonпропущено... Просто прозреваю как на пустом месте можно такой трешак себе создать . Рискну предположить что вся эта логика решат какую-то тривиальную штучку... грубо очень грубо созадется некий набор атрибутов для сферической задачи в вакууме и в джобу передается айдишка этого набора атрибутов, по которым потом порождается целый мешок действий и в базе появляется еще мешок сущностей. нет не тривиальный )) все тривиальные я уже пофиксил )) Ну... если вспомнить что есть такая SQL-ная практика что PK никогда не меняются. Тоесть если ты куда-то передаешь PK и у тебя ACID то все будет чики-пики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2017, 00:05 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
andreykaTа можно ли как то в рамках спринга передать какой-то этакий объект который как футура будет стоять до тех пор пока результат внутри него не появится? Опять городите черт пойми что. Если уж вы используете асинхронность, то subscriber and observer по идее должны быть полностью decoupled, в этом весь смысл. Именно чтобы избежать многопоточных багов, обычно это реализуется поверх системы мессаджинга на основе иммьютабл сообщений. Ну и асинхронность подразумевает как раз таки, что второй процесс запустится ПОСЛЕ того как данные для него готовы(в колбэке), а не будет их ждать такая архитектура называется другим словом У вас JVM одна? Вы не думайте в рамках фреймворка\энвайрнмента, а сначала подумайте как вашу проблему можно решить концептуально правильно в архитектурном плане, а потом уже реализовывайте свое решение. А то вы пытаетесь что-то там выкрутить ограничваясь контекстами спринга, хибера и всякого непонятного аоп. И поясните момент, так все это в рамках одного приложения(монолита)? Или приложения разные? Если монолит, то чем вас не устраивает обычный тредпул + Future? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2017, 00:06 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
maytonandreykaTпропущено... грубо очень грубо созадется некий набор атрибутов для сферической задачи в вакууме и в джобу передается айдишка этого набора атрибутов, по которым потом порождается целый мешок действий и в базе появляется еще мешок сущностей. нет не тривиальный )) все тривиальные я уже пофиксил )) Ну... если вспомнить что есть такая SQL-ная практика что PK никогда не меняются. Тоесть если ты куда-то передаешь PK и у тебя ACID то все будет чики-пики Я тоже никак не пойму, почему не взять да закоммитить? Да и вообще трешак конечно еще тот.. Почему нельзя завести таблицу необработанный набор атрибутов, джоб кварца создавать не из потока создавшего сущность, а по расписанию, эта джоба будет читать таблицу необработанный набор атрибутов(если записи еще нет - ну обработаем в след раз, не беда) и работать с гарантированно доступными данными? по завершению работы удалять запись из таблицы... wtf полный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2017, 00:11 |
|
||
|
многопоточка и хибер - как правильно?
|
|||
|---|---|---|---|
|
#18+
долго объяснять. в общем, нет. зы. да сделал я уже так и сделал - параллельный поток запускается после того как транзакция закоммитилась. сделал я так сдеееелал и да - работает. я просто пришел спросить, а как вообще в таких случаях поступать. и есть ли другие подходы. спасибо - услышал. или коммитим - потом шлем ссылку(айдишник), или шлем копию целиком. зы. монолит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2017, 00:23 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2122567]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
3ms |
| others: | 232ms |
| total: | 421ms |

| 0 / 0 |
