powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Много транзакций в цикле
11 сообщений из 11, страница 1 из 1
Много транзакций в цикле
    #39235496
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Мне нужно сделать множество коммитов в базу (порядка 50000), каждый в отдельной транзакции. Все это дело я запускаю в цикле. Транзакциями управляет EJB контейнер. Если кратко, то выглядит примерно так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@Stateless
class Starter {
  @Inject
  private Worker worker;
  @TransactionAttribute(NEVER)
  void create() {
    for (int i=0; i<50000;i++) {
      worker.createOrDocument();
    }
  }
}

@Stateless
class Worker {
  @TransactionAttribute(REQUIRES_NEW)
  void createOrUpdateDocument() {
      // работа с базой
  }
}



Запускаю starter.create(). Все идет сначала нормально. И вроде и должно идти ок. Я на всякий случай сделал метод в первом классе без транзакции (NEVER), чтобы избежать лишних transaction suspend и unsuspend при вызове метода createOrUpdateDocument.
Да вот проблема, ощущение что все это дело начинает работать все медленнее и медленнее. Так, скажем, на итерации 30000 приложение вообще перестает отвечать, только по логам видно, что что-то еще шевелится, но медленно-медленно, на каждый документ уходит по 10 секунд, при том что в самом начале меньше секунды требовалось. Как-то раз вообще свалилось с исключением о нехватки памяти. В чем же может быть проблема? Я ведь не накапливаю изменений в одной транзакции. Я каждое мелкое изменение отправляю в своей отдельной транзакции..

Сервер WildFly, база Oracle

Есть какие-нибудь идеи? Заранее спасибо!
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39235574
morewind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rabiter,

Если по мере вставки начинает работать медленнее, то скорее всего где-то в базе нужен индекс. Ну а падает иногда - пытается высчитать новое значение поля на основании предыдущих записей (которые не влазят в память и ой).
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39235602
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter...
Как-то раз вообще свалилось с исключением о нехватки памяти. В чем же может быть проблема?
...

Вот в ней (в памяти) скорее всего и проблема. 30000 записей - не тот объем, на котором начинает торомозить Оракл. Да и тормозит же не Оракл, а программа.
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39235604
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
morewindrabiter,
...
Ну а падает иногда - пытается высчитать новое значение поля на основании предыдущих записей (которые не влазят в память и ой).

Кстати да. Пример-то примерный. Кто ж знает что там на самом деле. Может, перед каждой вставкой умный ORM вычитывает все данные. C какого-то объема GC начинает себя ощутимо проявлять.
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39235613
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter, по внешнему виду у тебя захлёбывается кеш ORM-а.

Если на 30 000 итерации вдруг становится хуже. Что за реализация ORM-мапиинга
сказать трудно т.к. по твоему исходнику видны только интерфейсы EJB.

По поводу транзакций. Ты явно поступаешь неразумно. При массовых загрузках документов
или каких-то других сущностей никогда не делают транзакций 1:1.

Обычно всю загрузку объявляют одной транзакцией. Либо бьют множество документов
на пачки по 100 - 1000 штук и после каждой пачки делают commit.
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39235632
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter,
при таких количествах правильнее всё вывести в файл csv, а из него средствами базы загрузить будет намного быстее
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39236132
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiterДобрый день!
Мне нужно сделать множество коммитов в базу (порядка 50000), каждый в отдельной транзакции.
Обоснуйте. Зачем для вставки единичной записи в базу делать транзакцию?
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39236258
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick,
Как вариант - все валидные документы должны вставится. Остальные rollback.
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39236425
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем за советы!

Создание каждого отдельного документа в отдельной транзакции оправдано в моем случае: если документ по какой-то причине не получилось создать (штатная ситуация), то мы должны продолжить создавать остальные документы.

Похоже что проблема была в том, что на момент последнего эксперимента я не пометил метод Starter#create как TransactionAttribute.NEVER. В результате контейнер 50000 раз саспендил и ансаспендил транзакцию этого бина, что, возможно, и приводило к большим задержкам.
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39239093
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Garrick,
Как вариант - все валидные документы должны вставится. Остальные rollback.
Что есть "документ"? Одна запись в одной таблице или много различных записей в разных таблицах?
При первом варианте о каких транзакциях речь? При втором тоже сомнительно. Валидация данных и принятие решения об их сохранении в базу никак не относится к транзакциям. Вот если же в самой базе есть богатый функционал проверки данных и есть подозрения, что одна из записей (когда "вставка документа" подразумевает наличие нескольких взаимосвязанных записей) может быть отвергнута в результате проверки или сбоя, то тогда есть смысл говорить о транзакциях.
...
Рейтинг: 0 / 0
Много транзакций в цикле
    #39239097
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick,
а какая разница?
rollback мы говорим о СУБД. У хибера его нету.
Значит у автора валидность документа завязана на СУБД. Вот и всё.
Других вариантов дойти до конца цикла нету.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Много транзакций в цикле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]