Можете ли вы перезаписать размер пакета, установленный в SessionFactoryOptions? - PullRequest
0 голосов
/ 25 января 2019

Рассмотрим приведенный ниже код: перезапишет ли batch_size, настроенный для sessionFactory, значение 25, или возникнет какой-либо конфликт, поскольку конфигурация batch_size не соответствует коду?

//this prints: "Config batch_size: 100"
System.out.println("Config batch_size: "+sessionFactory.getSessionFactoryOptions().getJdbcBatchSize());
int batchSize = 25;
int batchCount = 0;
Session session = sessionFactory.getCurrentSession();
for (Users user : users) {
    session.update(user);
    batchCount++;
    if (batchCount % batchSize == 0) {
        session.flush();
        session.clear();
    }
}

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Ваш реализованный цикл и hibernate.jdbc.batch_size работают на разных уровнях.

Ваш цикл работает с сущностями (на ваш выбор).Но одному пользователю может потребоваться несколько вставок (например, если у пользователя несколько адресов).Все эти вставки выполняются как (25 вставок) одиночных вставок с использованием вашего цикла.Сброс и очистка просто не позволяют сеансу расти без ограничений.

hibernate.jdbc.batch_size, с другой стороны, объединяет (вставляет) операторы, которые идентичны и отличаются только значениями параметров, в один оператор,со списком наборов параметров.Выполнение такого пакетного оператора должно обрабатываться базой данных гораздо более эффективно, чем эквивалентные отдельные операторы.

он будет отправлять 25 запросов одновременно (по коду), а также отправлять 100 запросов одновременно(по конфигурации) но на другом уровне.Я надеюсь, что имеет смысл.

0 голосов
/ 25 января 2019

, если вы хотите вставить 1000 записей и настроить batch_size = 20, как показано ниже. Означает, что количество запросов "размера пакета" отправляется вместе за один раз вместо отправки каждого запроса, поскольку код запускает запрос. Поэтому в этом случае будет 1000 запросов на вставку, отправленных 50 раз с 20 запросами на вставку в каждом пакете.

property name = "hibernate.jdbc.batch_size" value = "20"

положить logger org.hibernate.engine.jdbc.batch.internal.BatchingBatch в уровень отладки. hibernate может генерировать пакеты размером 1,2 или 3 в случае неправильного порядка вставок. попробуйте использовать hibernate.order_inserts = true hibernate.order_updates = true

...