пакетный вкладыш hibernate - как работает flush? - PullRequest
3 голосов
/ 29 ноября 2011

Мне нужно вставить много данных в базу данных, используя Hibernate, я смотрел на пакетную вставку из Hibernate, то, что я использую, похоже на пример в руководстве:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

но я вижу, что flush не записывает данные в базу данных. Читая об этом, если код находится внутри транзакции, то ничего не будет зафиксировано в базе данных, пока транзакция не выполнит фиксацию.

Так что же нужно использовать flush / clear? кажется бесполезным, если данные не записаны в базу данных, то они находятся в памяти.

Как заставить Hibernate записать данные в базу данных?

Спасибо

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011

Данные отправляются в базу данных и больше не находятся в памяти.Это просто не сделано окончательно постоянным до фиксации транзакции.Это точно так же, как если бы вы выполняли следующие последовательности операторов в любом инструменте базы данных:

begin;
insert into ...
insert into ...
insert into ...
// here, three inserts have been done on the database. But they will only be made
// definitively persistent at commit time
...
commit;

Сброс состоит в выполнении операторов вставки.

Коммит состоит в выполнении оператора фиксации.

1 голос
/ 29 ноября 2011

Наличие flush() в указанном месте также экономит вашу память, так как ваш сеанс будет регулярно очищаться. В противном случае у вас будет 100000 объектов в памяти и вам может не хватить памяти для большего количества. Проверьте эту статью .

1 голос
/ 29 ноября 2011

Для лучшей производительности вы также должны совершать транзакции. Очистка и очистка сеанса очищает кэши гибернации, но данные перемещаются в кэши соединений JDBC и по-прежнему не загружены (разные RDBMS / драйверы показывают разное поведение) - вы просто перемещаете проблему в другое место без реального улучшения производительности.

1 голос
/ 29 ноября 2011

Данные будут записаны в базу данных, но в соответствии с уровнем изоляции транзакции вы не увидите их (в других транзакциях), пока транзакция не будет зафиксирована.

Используйте некоторый регистратор операторов sql, который печатаетstatmentes, которые транспортируются по соединению с базой данных, тогда вы увидите, что statmentes отправляются в базу данных.

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