Подтвердить что ты не робот

Лучший способ вставить хорошее количество записей в спящий режим

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

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

4b9b3361

Ответ 1

От * Персистентность и спящий режим Java (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

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

В соответствии с Batch Procession, "Операции insert(), update() и delete(), определенные интерфейсом StatelessSession, считаются это прямые операции на уровне строки базы данных, которые приводят к немедленному выполнению SQL INSERT, UPDATE или DELETE соответственно. Они имеют разную семантику операций save(), saveOrUpdate() и delete(), определенных интерфейсом сеанса."

Больше нет(), 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 для пакетной обработки.

Ответ 3

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

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

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

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

Ответ 4

Лучше всего использовать 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();

Ответ 5

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

Connection connection = DB.getConnection();