Ускорить массовое сохранение Grails сложной структуры класса домена

#grails #grails-orm

#grails #grails-orm

Вопрос:

У меня есть модель класса домена, состоящая из иерархической структуры ассоциаций 1: n, например

  • set (имеет много исправлений)
    • исправление (имеет много строк)
      • строка (имеет много ячеек)
        • ячейка

Отношения 1: n реализуются с помощью hasMany и принадлежат отображениям в классах домена. Экземпляры домена создаются из загруженных файлов, и в некоторых случаях одно исправление может состоять из 20 000 строк с 20 ячейками для каждой строки.

В настоящее время загруженный файл анализируется, объекты домена создаются, но на данный момент не сохраняются, поскольку экземпляры должны быть проверены и отображаться сообщения об ошибках. Если все экземпляры не содержат ошибок, я сохраняю класс домена верхнего уровня, например:

 set.save()
 

Это позволяет сохранить набор и все связанные экземпляры домена на всех уровнях. Теперь все управляется GORM. Для огромных структур процесс сохранения имеет тенденцию становиться очень медленным, потому что, скорее всего, сеанс гибернации становится больше.

Я не хочу сохранять экземпляры немедленно, потому что ошибки проверки должны быть суммированы и отображены пользователю. Поэтому я не могу сбрасывать сеанс гибернации каждые 100 записей.

Тесты производительности показывают, что для 8906 строк с 13 ячейками в каждой строке требуется 5:01 минут = 115.778 записей.

Окружающая среда:

  • Grails 3.1.8
  • Mysql DB 5.7

Есть ли предложения по ускорению процедуры сохранения?

Комментарии:

1. Ваша проблема во время выполнения не связана с grails / gorm / hibernate. Даже если вы будете использовать обычный jdbc с транзакциями, вы столкнетесь с этой проблемой, если не будете фиксировать свою работу каждые x (например, 100) записей. На мой взгляд, вы должны найти обходной путь. Возможно, используйте маркер ошибки или удалите записи впоследствии в случае ошибки и т.д. …

2. сложные структуры данных на самом деле не очень удобны для быстрой пакетной обработки. смирись с этим

3. @injecteer вы совершенно правы, структура не очень удобна для пакетной обработки, но в настоящее время нет времени на рефакторинг. После выполнения нескольких тестов с каскадом none, сеансом hibernate без состояния, сбросом gorm после определенных вставок … оказалось, что подход с каскадными ассоциациями (с hasMany, belongsTo) является самым быстрым, что было очень удивительно.