Я хочу вставить список из 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();
}
}




На странице 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 для сброса.
Коммит платный и занимает много времени, поэтому тоже происходит только в конце.
Переместите транзакцию вокруг
for loop. Транзакции действительно замедляют спящий режим