быстрая вставка многих сущностей в Hibernate - PullRequest
0 голосов
/ 15 мая 2019

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

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();
        }
    }

1 Ответ

0 голосов
/ 15 мая 2019

На странице 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 для сброса.

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