Быстрая вставка многих сущностей в Hibernate

Я хочу вставить список из 170 000 объектов в мою локальную установленную базу данных MySQL 8.0, используя Hibernate 4.2. В настоящее время я делаю это с помощью метода сохранения сеанса #. Но вставка этих многочисленных сущностей длится так долго. Так есть ли возможность сделать это быстрее?

for (Agagf x : list) {
    create(x);
}

// ------------------------

    public static void create(Object obj) throws DatabaseException {
        Session hsession = null;

        try {
            hsession = SqlDataHibernateUtil.getSessionFactory().openSession();
            Transaction htransaction = hsession.beginTransaction();
            hsession.save(obj);
            htransaction.commit();
        } catch (HibernateException ex) {
            throw new DatabaseException(ex);
        } finally {
            if (hsession != null)
                hsession.close();
        }
    }

Переместите транзакцию вокруг for loop. Транзакции действительно замедляют спящий режим

XtremeBaumer 15.05.2019 12:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На странице Hibernate есть эта статья: http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch15.html

По их словам, вам понадобится что-то вроде этого:

create(list);

// ------------------------

public static void create(List<Object> objList) throws DatabaseException {
  Session hsession = null;

  try {
    hsession = SqlDataHibernateUtil.getSessionFactory().openSession();
    Transaction htransaction = hsession.beginTransaction();

    int count = 0;
    for(Agagf x: objList) {
        hsession.save(obj);
        if ( ++count % 20 == 0 ) { //20, same as the JDBC batch size
            //flush a batch of inserts and release memory:
            hsession.flush();
            hsession.clear();
            count = 0;
        }
    }
  } catch (HibernateException ex) {
    throw new DatabaseException(ex);
  } finally {
    htransaction.commit();
    if (hsession != null) {
      hsession.close();
    }
  }
}

Кроме того, конфигурация для включения пакетной обработки:

если вы выполняете пакетную обработку, вам необходимо включить использование JDBC. дозирование. Это абсолютно необходимо, если вы хотите достичь оптимального представление. Установите размер пакета JDBC на разумное число (например, 10-50):

hibernate.jdbc.batch_size 20

Редактировать: в вашем случае поиграйте с размером пакета, чтобы он лучше соответствовал вашему объему. Просто не забудьте сделать одинаковый размер как в конфигурации, так и в операторе if для сброса.

Коммит платный и занимает много времени, поэтому тоже происходит только в конце.

Brother 15.05.2019 12:12

Другие вопросы по теме

Похожие вопросы

POJO имеют нулевые значения при преобразовании с помощью jackson
Возврат подключенного сокета возвращает ноль
Я установил тайм-аут на сокете и обнаружил, что это значение не может быть больше 21
Хранение большого количества денежных сумм и последствий для памяти/хранилища - BigDecimal vs Integer и лучшие практики?
Динамически находите правильный метод, чтобы не повторять один и тот же код
Как я могу отсортировать карту по набору ключей?
Вызов элементов пользовательского интерфейса с Appium в тестах Cucumber в Java Android приводит к сбою сборки с большим количеством журналов
Kerberos: недопустимый заголовок согласования (причина GSSException: не предоставлены действительные учетные данные (уровень механизма: не удалось найти какие-либо учетные данные Kerberos))
Метод прокрутки не выполняет прокрутку в приложении для Android
Я не побелею, эта итерация не работает?