У Теда Нейлида есть хорошая запись об улучшении производительности пакетной вставки / обновления.Вы сталкивались с этим?Его предложения сработали для меня для пакетных обновлений.
Вот выдержка из статьи внизу:
Обычно сеанс grails hibernate выполняет что-то быстро и возвращает.Во время импорта мы выполняем тонну обработки, все с одним и тем же сеансом гибернации.Все эти объекты, которые обычно будут собираться мусором при закрытии сеанса, накапливаются.
Самый простой способ справиться с этим - создать простой метод периодической очистки этих коллекций.
Он предлагает периодически очищать и очищать сеанс.
data.eachWithIndex { datum, index ->
// insert or update datum
if(index % 100 == 0) {
def session = sessionFactory.currentSession()
session.flush()
session.clear()
// also clear the Grails domain class property instance map
// - it may be that this isn't necessary anymore; not sure, but the article is
// a bit old, so maybe it's been fixed within Grails.
}
}
Используя это, он улучшает пакетную вставку записей по 100 тыс. С ~ 2,5 часа до 3 минут.
@Тед - Если вы сталкиваетесь с этим вопросом / ответом и хотели бы повторить этот ответ самостоятельно, я был бы более чем счастлив удалить мой ответ и поднять ваш голос;Вы сделали всю тяжелую работу, выясняя это.Спасибо!