|
|
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
Добрый день! Мне нужно сделать множество коммитов в базу (порядка 50000), каждый в отдельной транзакции. Все это дело я запускаю в цикле. Транзакциями управляет EJB контейнер. Если кратко, то выглядит примерно так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Запускаю starter.create(). Все идет сначала нормально. И вроде и должно идти ок. Я на всякий случай сделал метод в первом классе без транзакции (NEVER), чтобы избежать лишних transaction suspend и unsuspend при вызове метода createOrUpdateDocument. Да вот проблема, ощущение что все это дело начинает работать все медленнее и медленнее. Так, скажем, на итерации 30000 приложение вообще перестает отвечать, только по логам видно, что что-то еще шевелится, но медленно-медленно, на каждый документ уходит по 10 секунд, при том что в самом начале меньше секунды требовалось. Как-то раз вообще свалилось с исключением о нехватки памяти. В чем же может быть проблема? Я ведь не накапливаю изменений в одной транзакции. Я каждое мелкое изменение отправляю в своей отдельной транзакции.. Сервер WildFly, база Oracle Есть какие-нибудь идеи? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2016, 18:23 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
rabiter, Если по мере вставки начинает работать медленнее, то скорее всего где-то в базе нужен индекс. Ну а падает иногда - пытается высчитать новое значение поля на основании предыдущих записей (которые не влазят в память и ой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2016, 21:24 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
rabiter... Как-то раз вообще свалилось с исключением о нехватки памяти. В чем же может быть проблема? ... Вот в ней (в памяти) скорее всего и проблема. 30000 записей - не тот объем, на котором начинает торомозить Оракл. Да и тормозит же не Оракл, а программа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2016, 22:50 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
morewindrabiter, ... Ну а падает иногда - пытается высчитать новое значение поля на основании предыдущих записей (которые не влазят в память и ой). Кстати да. Пример-то примерный. Кто ж знает что там на самом деле. Может, перед каждой вставкой умный ORM вычитывает все данные. C какого-то объема GC начинает себя ощутимо проявлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2016, 22:53 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
rabiter, по внешнему виду у тебя захлёбывается кеш ORM-а. Если на 30 000 итерации вдруг становится хуже. Что за реализация ORM-мапиинга сказать трудно т.к. по твоему исходнику видны только интерфейсы EJB. По поводу транзакций. Ты явно поступаешь неразумно. При массовых загрузках документов или каких-то других сущностей никогда не делают транзакций 1:1. Обычно всю загрузку объявляют одной транзакцией. Либо бьют множество документов на пачки по 100 - 1000 штук и после каждой пачки делают commit. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2016, 23:06 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
rabiter, при таких количествах правильнее всё вывести в файл csv, а из него средствами базы загрузить будет намного быстее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2016, 23:24 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
rabiterДобрый день! Мне нужно сделать множество коммитов в базу (порядка 50000), каждый в отдельной транзакции. Обоснуйте. Зачем для вставки единичной записи в базу делать транзакцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2016, 20:36 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
Garrick, Как вариант - все валидные документы должны вставится. Остальные rollback. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2016, 09:00 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за советы! Создание каждого отдельного документа в отдельной транзакции оправдано в моем случае: если документ по какой-то причине не получилось создать (штатная ситуация), то мы должны продолжить создавать остальные документы. Похоже что проблема была в том, что на момент последнего эксперимента я не пометил метод Starter#create как TransactionAttribute.NEVER. В результате контейнер 50000 раз саспендил и ансаспендил транзакцию этого бина, что, возможно, и приводило к большим задержкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2016, 12:33 |
|
||
|
Много транзакций в цикле
|
|||
|---|---|---|---|
|
#18+
Petro123Garrick, Как вариант - все валидные документы должны вставится. Остальные rollback. Что есть "документ"? Одна запись в одной таблице или много различных записей в разных таблицах? При первом варианте о каких транзакциях речь? При втором тоже сомнительно. Валидация данных и принятие решения об их сохранении в базу никак не относится к транзакциям. Вот если же в самой базе есть богатый функционал проверки данных и есть подозрения, что одна из записей (когда "вставка документа" подразумевает наличие нескольких взаимосвязанных записей) может быть отвергнута в результате проверки или сбоя, то тогда есть смысл говорить о транзакциях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2016, 13:55 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2124046]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 398ms |

| 0 / 0 |
