2015-11-25 2 views
3

В моем приложении весной я хочу вставить почти 1500 записей в базу данных за один раз. Я использую Spring 4.X и простой спящий режим в backend. В моем сервисе я использую аннотацию @Transactional. Теперь, вставляя записи после некоторой точки, я получаю ошибку outofmemory. После поиска в Интернете я узнал, что мы можем использовать что-то подобное этомуПакетные вставки с аннотацией @Transactional

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

Однако, приведенный выше код они используют SessionFactory и транзакции вручную и использовать флеш и ясно на объект сессии и сделать я ручной фиксации.

В моем случае я не хочу использовать вышеприведенный код, я хочу использовать аннотацию @Transactional, чтобы сделать эту работу.

Пожалуйста, предложите

Я не хочу использовать сессионный фабрику и объект транзакции вручную. .... @ транзакционной должны делать это все

+1

Какова ваша конфигурация весны xml? –

+0

Просто удалите сеансовую передачу (используйте 'sessionFactory.getCurrentSession' и оставьте' flush' и 'clear'. –

+0

Означает ли это, что в моем коде мне нужно принудительно использовать sessionFactory вручную? Не могу ли я использовать аннотацию @Transactional? – user3534483

ответ

0

Если вы хотите перейти от ВМТ (Bean Managment транзакции) в КРТ (Container Transaction Managment), ваш фрагмент кода на код будет стали:

@Transactional(propagation=Propagation.REQUIRES_NEW) 
public void saveCustomers(){ 
    for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
    } 
} 

Контейнер очистите все объекты, когда метод завершится. Теперь я хочу спросить вас: зачем вам нужно каждые 20 сущностей?

+0

Если вам нужно задать вопрос, я настоятельно рекомендую прочитать о том, как работает спящий режим, особенно с учетом для кэширования и проверки грязных файлов. –

+0

Возможно, вы захотите периодически скрываться, чтобы не хранить все 100000 экземпляров клиента в кэше первого уровня в спящем режиме. – Mohit

+0

Исправить, но в этом случае мне нужно принудительно использовать SessionFactory и объект Transaction вручную. в случае @Transactional аннотации, которую он совершает/откаты внутренне – user3534483