// Assume List to be of 50
for (int i = 0; i < 50 ; i++) {
Car c = new Car( car.get(i).getId(),car.get(i).getName() );
getCurrentSession().save(c);
// 20 car Objects which are saved in memory syncronizes with DB
if (i % 20 == 0)
getCurrentSession().flush();
}
Еще несколько указателей относительно того, почему промывка должна соответствовать размеру партии
Чтобы включить пакетирование, вам нужно установить размер пакета jdbc
// In your case
hibernate.jdbc.batch_size =20
Одна распространенная ловушка при использовании пакетной обработки - если вы используете обновление одного объекта или вставляете, все идет хорошо. Но в случае
Вы используете несколько объектов, ведущих к множественным вставкам / обновлениям, тогда вам придется явно установить механизм сортировки.
Например
// Assume List to be of 50
for (int i = 0; i < 50 ; i++) {
Car c = new Car( car.get(i).getId(),car.get(i).getName() );
// Adding accessory also in the card here
Accessories a=new Accessories("I am new one");
c.add(a);
// Now you got two entities to be persisted . car and accessory
// Two SQL inserts
getCurrentSession().save(c);
// 20 car Objects which are saved in memory syncronizes with DB
// Flush here clears the car objects from 1st level JVM cache
if (i % 20 == 0)
getCurrentSession().flush();
getCurrentSession().clear();
}
Вот в этом случае
два sql генерируются
1 для вставки в машину
1 для вставки в аксессуар
Для правильного дозирования вам необходимо установить
<prop key="hibernate.order_inserts">true</prop>
так, чтобы все вставки для автомобиля были отсортированы вместе, и все вставки принадлежностей были отсортированы вместе. Таким образом, у вас будет 20 вставок вставки в серии, а не 1 выстрел стр. За раз.
Для различных операций в рамках одной транзакции вы можете взглянуть на http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/event/def/AbstractFlushingEventListener.html