2015-09-17 3 views
0

Каков рекомендуемый способ вставки партии записей или нет, если база данных вызывает ошибку для любой из вставок? Вот мой текущий код:Активная вставка и транзакция ActiveJDBC

PreparedStatement ps = Base.startBatch("INSERT INTO table(col1) VALUES(?)"); 
for (MyModel m : myModels) 
    Base.addBatch(ps, m.getCol1()); 
Base.executeBatch(ps); 
ps.close(); 

Это вставляет записи, пока первый, который выходит из строя (если случится).
Я хочу, чтобы все или ничего, чтобы вставить, то я имел в виду обертывание executeBatch():

Base.openTransaction(); 
Base.executeBatch(ps); 
Base.commitTransaction(); 

Если это верно, то я должен делать Base.rollbackTransaction() в некоторых try catch?
Должен ли я также закрыть ps.close() в блоке finally?

Спасибо!

ответ

0

Выполненные пакетные операции не отличаются от операций, не связанных с операциями. Пожалуйста, смотрите следующее: http://javalite.io/transactions#transacted-activejdbc-example для типичного шаблона.

Вы сделаете это, то:

List<Person> myModels = new ArrayList<>(); 
    try{ 
     Base.openTransaction(); 
     PreparedStatement ps = Base.startBatch("INSERT INTO table(col1) VALUES(?)"); 
     for (Person m : myModels){ 
      Base.addBatch(ps, m.getCol1()); 
     } 
     Base.executeBatch(ps); 
     ps.close(); 
     Base.commitTransaction(); 
    }catch(Exception e){ 
     Base.rollbackTransaction(); 
    } 

Таким образом, ваши данные нетронутыми в случае исключения

+0

Но в вашем примере 'ps.close()' не будет достигнута, если есть исключение, это нормально? –

+0

уверен, это просто псевдокод. Вам понадобится блок 'finally' для закрытия ресурсов, включая соединение – ipolevoy