Лучший способ вставить хорошее количество записей в спящий режим
Я использую hibernate + play! рамки на работе, есть ли "лучшая практика" по вложению большого количества записей с использованием спящего режима? Они составляют от 6000 до 10 000 экземпляров в текстовом файле, поэтому я не знаю, будет ли Hibernate задыхаться от заданий или выдавать исключение.
Любое предложение, дайте мне знать, дайте мне знать, если мне придется больше объяснять
Ответы
Ответ 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();