|
|
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
Приложение на Spring Data JPA. Конфигурационных файл app-context.xml Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. пример типовой сущности, репозитория и DAO Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. На данный момент все операции save, насколько я понял, выполняются отдельными транзакциями. В приложении запускаются несколько потоков с интенсивной обработкой данных, но несмотря на то, что сконфигурирован пул соединений (BoneCP) по трассировке БД видно, что все потоки используют только одно соединение. 1. Как настроить, чтобы каждый поток работал с отдельным коннектом? 2. Как правильно задать границы транзакции, если мне надо, чтобы в определенном месте кода при работе с сущностями началась транзакция и в определенном месте она заканчивалась? 3. Как при выполнении уже существующей транзакции независимо выполнить другую транзакцию - например записать строку в таблицу лога, при этом фиксация (или откат) во второй транзакции никак не должна влиять на основную транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 10:53 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
publexus1. Как настроить, чтобы каждый поток работал с отдельным коннектом? А оно надо? Зачем тогда пул? publexus2. Как правильно задать границы транзакции, если мне надо, чтобы в определенном месте кода при работе с сущностями началась транзакция и в определенном месте она заканчивалась? Использовать @Transactional на уровне сервиса. publexus3. Как при выполнении уже существующей транзакции независимо выполнить другую транзакцию - например записать строку в таблицу лога, при этом фиксация (или откат) во второй транзакции никак не должна влиять на основную транзакции? Google -> Spring Declarative Transaction Propagation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 11:20 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
Blazkowiczpublexus1. Как настроить, чтобы каждый поток работал с отдельным коннектом? А оно надо? Зачем тогда пул?Т.к. по сути - это сервис, обрабатывающий запросы, и обработка может включать длинные транзакции, поэтому надо обеспечить параллельную работу. Но, возможно, это достигается правильной настройкой 2-го пункта. Blazkowiczpublexus2. Как правильно задать границы транзакции, если мне надо, чтобы в определенном месте кода при работе с сущностями началась транзакция и в определенном месте она заканчивалась? Использовать @Transactional на уровне сервиса.Добавлял я @Transactional к примеру для метода MyClass.processData, но в результате, все операции с сущностями внутри этого метода все равно выполнялись отдельными фиксациями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 11:47 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
publexusТ.к. по сути - это сервис, обрабатывающий запросы, и обработка может включать длинные транзакции, поэтому надо обеспечить параллельную работу. Но, возможно, это достигается правильной настройкой 2-го пункта. Длинные транзакции и многопоточность это какое-то стремное сочетание. Нужно ещё чтобы и база справилась. publexusИспользовать @Transactional на уровне сервиса.Добавлял я @Transactional к примеру для метода MyClass.processData, но в результате, все операции с сущностями внутри этого метода все равно выполнялись отдельными фиксациями.[/quot] фиксациями? Надо подебажить. Почитать логи. Проверить смог ли Spring завернуть MyClass в прокси, чтобы перехватывать вызов к processData и запускать транзакцию. Может у вас processData вызывается из того же класса? Может MyClass создаётся без IoC? Не знаю как там точно на аннотациях и в последниех версиях, но на XML раньше надо было явно оборачивать сервисы через TransactionProxyFactoryBean. Думаю, сейчас уже спринг сам это делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 11:57 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДлинные транзакции и многопоточность это какое-то стремное сочетание. Нужно ещё чтобы и база справилась. Почему же стремно? Если архитектура и структура позволяет выполнять определенные транзакции, практически без риска блокировок других сессий, почему бы им и не быть столь длинными, сколь этого требует логика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 12:09 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
publexusПочему же стремно? Если архитектура и структура позволяет выполнять определенные транзакции, практически без риска блокировок других сессий, почему бы им и не быть столь длинными, сколь этого требует логика. Вы об этом лучше у DBA поспрашивайте. Если у вас можно изолировать транзакции так чтобы они друг-другу не мешали, то вам и транзакции тогда особо не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 12:16 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсли у вас можно изолировать транзакции так чтобы они друг-другу не мешали, то вам и транзакции тогда особо не нужны. Почему же, транзакции нужны не только для эксклюзивности, но и для атомарности. Например, если нужно, чтобы в базу был загружен пакет данных, причем обязательно либо полностью, либо не загружен вовсе, и при этом нет необходимости блокировать разделяемые данные. Это как раз такой случай, когда транзакция необходима, и при этом может быть сколь угодно долгой без ущерба для остальных процессов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 12:52 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
publexusПочему же, транзакции нужны не только для эксклюзивности, но и для атомарности. Например, если нужно, чтобы в базу был загружен пакет данных, причем обязательно либо полностью, либо не загружен вовсе, и при этом нет необходимости блокировать разделяемые данные. Это как раз такой случай, когда транзакция необходима, и при этом может быть сколь угодно долгой без ущерба для остальных процессов. Для этого, зачастую, достаточно кэша первого уровня ORM, которые все изменения в транзакции накапливает в Session/EntityManager и только при комите\флаше сбрасывает их в базу. Таким образом можно сократить длину транзакции в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 13:02 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
Судя по вашим словам, вам не требуется блокировать что-то в БД в начале вашей "длинной" транзакции. Тогда почему не оставить всю "длинность" на уровне сервиса, а в БД писать, когда уже все будет "на руках"? А атомарность, изолированные транзакции и т.п. на уровне БД, реализовать через хранимую процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 13:48 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
Iliyam, Можно и так сделать, хранить все данные в памяти, и затем сбрасывать их в базу единовременно. Но если данных будет много, да еще и несколько потоков, хватит ли на все памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 14:26 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
publexusМожно и так сделать, хранить все данные в памяти, и затем сбрасывать их в базу единовременно. Но если данных будет много, да еще и несколько потоков, хватит ли на все памяти? А если всё хранить в логе транзакций, хватит ли на всё IO диска? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 14:27 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
publexus, а вы считаете открытый коннект к БД памяти не требует? Плюс доп расходы в виде записи в логи, как сказал Blazkowicz, и т.п. В любом случае расходы будут. Проблема в том, что реализовать те хотелки, что вы перечислили, используя ORM довольно проблематично. Да в общем и несильно надо, т.к. критичен момент записи в БД, а это можно гарантировать через хранимки в самой БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 15:48 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
не понял проблему. - надо указать пулу МАКС_КОННЕКТОВ = 100 и работать - либо делать пул потоков и на каждый поток - соединение, но пул убрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 15:52 |
|
||
|
Spring Data JPA, мультипоточность
|
|||
|---|---|---|---|
|
#18+
publexusIliyam, Можно и так сделать, хранить все данные в памяти, и затем сбрасывать их в базу единовременно. Но если данных будет много, да еще и несколько потоков, хватит ли на все памяти? монопсуально - в БД выделяется память под откат транзакции админом - нет проблем - на АппСервере аналогично. Если у вас не изврат, то программист о памяти не заботится )) (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 16:11 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38636830&tid=2127211]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 478ms |

| 0 / 0 |
