Объемные вставки с пружиной / спящим - PullRequest
8 голосов
/ 03 августа 2009

Я использую в своем приложении микс Spring / Hibernate (ничего оригинального). Для данной функции мне нужно импортировать содержимое файла CSV в таблицу моей БД Oracle. Пока я просто создаю объекты, я делаю

   HibernateTemplate.saveOrUpdate

на каждом из них (мне нужно получить только что выделенный идентификатор)

Затем транзакция происходит в конце метода с использованием API транзакции Spring.

Все отлично работает, кроме производительности, которая подходит для некоторых объектов 5000, но не для 100 000 ...

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

Ответы [ 4 ]

7 голосов
/ 03 августа 2009

Что-то простое, что вы можете попробовать, это очистить и очистить сеанс, скажем, каждые 100 объектов ...

так выполнить

session.flush();
session.clear();

каждые 100 или 1000 вставок.

Это очистит и очистит сеанс гибернации и остановит его слишком большой рост (возможно, поэтому ваши 100 000 объектов занимают так много времени).

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

Источником этого послужило постоянство Java Мэннинга в Hibernate (великая книга - много раз спасала мою кожу).

6 голосов
/ 03 августа 2009

Вы также можете рассмотреть возможность использования StatelessSession , так как он предназначен для массовых операций.

StatelessSession ss=sessionFactory().openStatelessSession();
Transaction tx=ss.beginTransaction();
3 голосов
/ 04 августа 2009

Иногда ORMapper не подходит для молотка. В частности, пакетные операции часто выполняются более эффективно с использованием простого старого JDBC. Это, конечно, зависит от множества условий, но вы должны по крайней мере рассмотреть это как вариант и сравнить производительность обоих подходов.

0 голосов
/ 09 февраля 2010

Это не просто проблема производительности вставки базы данных; если вы создаете десятки тысяч объектов и не выполняете очистку, сеанс Hibernate будет расти до тех пор, пока не закончится память.

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