#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) является самым быстрым, что было очень удивительно.