С Spring транзакции с Hibernate, как вы можете получить 2000 + вставки, чтобы не замедляться в той же транзакции? - PullRequest
2 голосов
/ 29 июня 2010

У меня есть любопытная маленькая проблема.У меня есть служба, которая должна создать 2000 записей в базе данных, минимум на разных таблицах.Хотя было бы неплохо, чтобы они выполнялись в одной и той же транзакции, производительность может быть очень плохой - около 400-600 вставок.

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

Это становится действительно плохопотому что у нас есть одна служба, которая в основном импортирует 200 мегабайт данных XML в базу данных, что приводит к примерно 70 000 вставок.Это займет около 1,5 часов.

Итак, в Spring есть способ, которым я могу сказать: "Держите сеанс гибернации открытым, потому что мы хотим, чтобы ленивая загрузка и все работало ... но неположить что-нибудь в транзакцию? "

1 Ответ

6 голосов
/ 29 июня 2010

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

Также убедитесь, что вы используете параметр пакетной обработки JDBC. Если вы не используете его, то Hibernate будет записывать одну строку в базу данных за раз, а не записывать несколько строк в пакетах. Вы можете поэкспериментировать с различными размерами пакетов в зависимости от базы данных и драйвера.

Имейте в виду, что Hibernate связан с большими накладными расходами на отслеживание объектов и грязную проверку. Если производительность с настройками не соответствует вашим требованиям, вы можете рассмотреть возможность использования файлов отображения Hibernate для генерации необработанного SQL, но вставки данных с использованием необработанного JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...