Каков наилучший подход для вставки (обновления) множества сущностей с использованием Hibernate? - PullRequest
2 голосов
/ 16 февраля 2012

Мне нужно выполнить что-то вроде

   for (int i = 0; i<=moreThanThousand; i++){
       Entity e = new Entity();
       insertEntity(e);
   }

или

for (Entity e: moreThanThousandEntities){
       updateEntity(e);
   }

Есть ли какой-нибудь пакетный механизм в Hibernate?Имеет ли смысл выполнять эту работу в несколько потоков?Какова лучшая практика?С JDBC я бы использовал методы PreBredStatement для addBatch () и executeBatch (), но я не эксперт в Hibernate.Заранее спасибо!

Ответы [ 2 ]

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

Вы можете определить размер партии, используя:

hibernate.jdbc.batch_size 20

Вставка / обновление в пакетах легко:

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

Для более подробной информации, посмотрите здесь .

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

Если вы обрабатываете большой объем данных, например, импортируете данные каждый день, и у вас для этого есть очень небольшое окно обработки, лучший способ, к сожалению, получить прямой доступ к вашей БД с использованием JDBC, рассмотрите все это:

  • Сборщик мусора - избегайте создания и освобождения миллионов объектов при критических операциях
  • Импорт данных помимо обработки данных. Попробуйте обработать данные в базе данных с помощью хранимой процедуры. Там вы можете достичь максимальной производительности, связывая данные с другими бизнес-данными (обычно необходимыми).
  • Физическая проверка данных - Операции синтаксического анализа и физическую проверку вы предпочитаете выполнять только на этапе импорта, оставьте для хранимых процедур только очищенные данные, которые будут проверены на соответствие другим бизнес-данным внутри БД.
  • Трубопровод. Рассмотрите возможность создания конвейера обработки, чтобы выполнять несколько этапов одновременно. При импорте данных уже импортированные данные асинхронно обрабатываются хранимыми процедурами и т. Д.

Я могу вам сказать, что в системах, когда мы должны обрабатывать около 8 миллионов записей (у меня объем не в байтах, но большой) ежедневно в течение всего 2 часов в день, таким образом, это был единственный способ достичь максимальной производительности даже с использованием максимально разрешенного оборудования.

Надеюсь, я дал вам новый полезный подход для рассмотрения.

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