2012-02-16 2 views
0

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

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

В настоящее время мой код генерирует массив из примерно 6 000 из этих объектов домена, а затем для каждого save. Это все внутри withTransaction.

Это займет около 10 секунд, чтобы сэкономить. Числа немного хуже с источником данных HSQLDB in-memory. Я пробовал следовать инструкциям по очистке сеанса и тому подобное, но это только увеличивает время, которое требуется.

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

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

ответ

0

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. См. Также Application Profiling в документации по H2.

Смежные вопросы