Лучший способ вставить большое количество записей в спящий режим - PullRequest
11 голосов
/ 03 января 2011

Я использую hibernate + play!Framework на работе, есть ли "лучшая практика" по вставке большого количества записей с помощью Hibernate?Они составляют от 6000 до 10000 на текстовый файл, поэтому я не знаю, собирается ли Hibernate задушить работу или выдать исключение.

Любое предложение, дайте мне знать, дайте мне знать, если мне придется объяснить больше

Ответы [ 5 ]

24 голосов
/ 03 января 2011

Из * Java Persistence and Hibernate "(Manning) и после комментария от Pangea используйте сеанс без сохранения состояния (который не имеет кеша постоянного контекста):

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Item item = new Item(...);
    session.insert(item);
}
tx.commit();
session.close();
2 голосов
/ 08 января 2015

Просто некоторые исправления кодов в ответе Карточа.

Согласно Пакетная обработка , «операции вставки (), обновления () и удаления (), определенные интерфейсом StatelessSession, считаются прямыми операциями на уровне строки базы данных. Они приводят к немедленному выполнению SQL INSERT, UPDATE или DELETE соответственно. Они имеют различную семантику для операций save (), saveOrUpdate () и delete (), определенных интерфейсом Session. "

Нет больше save (), flush (), clear () для StatelessSession. Код должен быть таким:

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
  Item item = new Item(.....);
  session.insert(item );
}    

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

Наконец, здесь обсуждается разница между обычной пакетной вставкой и вставкой StatelessSession: Использование StatelessSession для пакетной обработки .

1 голос
/ 06 августа 2013

Лучше всего использовать StatelessSessions. Рассмотрим следующий пример из (http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/batch.html):

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();

ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    session.update(customer);
}

tx.commit();
session.close();
1 голос
/ 03 января 2011

Просто откройте сеанс и транзакцию.

Добавление всех элементов в сохранение сеанса.

Затем совершите транзакцию.

//Remember to effective handler errors
public void saveAll(List<Object> list) throws Exception{
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
for(Object obj : list)
 s.save(obj);
tx.commit();
s.flush();
s.close();
}
0 голосов
/ 03 января 2011

Вы всегда можете получить объект Connection напрямую, если вы хотите выполнить вставку вне hibernate.

Connection connection = DB.getConnection();
...