Медленный пакетный импорт с базой данных H2 в памяти - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть класс домена с пятью свойствами, все из которых являются либо строками, целыми числами, либо двойными. Я использую базу данных H2 в памяти в качестве источника данных для этого класса домена. Это единственный объект, хранящийся в этой базе данных; остальные хранятся в совершенно отдельной базе данных MySQL.

База данных H2 является временной. Данные загружаются из удаленно загруженного файла CSV каждый час и заменяют старые данные в базе данных. Поскольку все остальные процессы должны ждать его завершения, важно, чтобы он был максимально быстрым.

Прямо сейчас мой код генерирует массив из примерно 6000 этих доменных объектов, затем для каждого save s. Это все внутри withTransaction.

Для сохранения требуется около 10 секунд. Цифры немного хуже с источником данных HSQLDB в памяти. Я пробовал следовать инструкциям по очистке сеанса и тому подобному, но они только увеличивают время, которое требуется.

Как лучше всего ускорить пакетную вставку этих 6000 объектов? Будет ли отказ от GORM и непосредственное написание операторов вставки SQL значительно быстрее?

// data is an array of about 6,000 domain objects
data.each { item ->
    item.save()
}

1 Ответ

0 голосов
/ 16 февраля 2012

CSV import - очень важный пример использования.H2 имеет поддержку быстрого импорта CSV.Скорее всего, это быстрее, чем при использовании инструмента.

Вы сказали «удаленно загруженный файл CSV».Это временный файл?Если да, вы можете использовать импорт CSV из файла.Самый быстрый способ -

CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))
AS SELECT * FROM CSVREAD('test.csv');

Это быстрее, чем сначала создать таблицу, а затем вставить.Это также быстрее, чем использование пакетной вставки.

Если у вас нет файла, а есть только входной поток, вы можете использовать инструмент CSV напрямую, используя new Csv().read(Reader r), прочитать строки и вставить ихих в базу данных.

Конечно, вы можете попытаться выяснить, где узкое место, путем профилирования.Вы можете использовать свой собственный профилировщик или встроенный профилировщик H2.См. Также Профилирование приложения в документации по H2.

...