2010-01-06 4 views
1

Как я могу получить каждый вызов, чтобы сохранить фиксацию в базе данных?хотите, чтобы каждый вызов, чтобы сохранить фиксацию

Я не хочу, чтобы каждое взаимодействие цикла, в котором я находился, вызывало фиксацию, а затем перезапускал транзакцию.

для моего приложения, просто наличие фиксации на каждом сеансе. Хорошо.

+0

@duffymo, и я действительно ценю вашу помощь. Я новичок в Java и кодирую свое первое «основное» приложение, и ваша помощь была превосходной! (и все остальные) – mrblah

+1

Mrblah, я должен признать, что тоже немного беспокоиться - 21 вопрос за последние 24 часа? Похоже, что вместо того, чтобы тратить время на изучение самостоятельно, вы просто добираетесь до такой степени, что большинство из них начнет искать решение и размещать здесь. Хотя это не ужасно, это действительно один из худших способов узнать новый язык ... – delfuego

+0

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

ответ

1

EDIT: используйте транзакцию Спящей обработок

Session s = factory.getCurrentSession(); 
try { 
    s.beginTransaction(); 
    Thing thing = new Thing(); 
    s.save(thing); 
    s.getTransaction().commit(); 
} catch (RuntimeException e) { 
    s.getTransaction().rollback(); 
    throw e; 
} 

Сделки с Hibernate подробно здесь:

В среде сервлет, спящий режим рекомендует реализация фильтра, который начинает транзакцию, когда запрос начинается и заканчивается, когда запрос готово. Пример кода здесь:

При использовании JTA или EJB существуют методы для работы с существующим контекстом транзакции, как описано в руководстве.

В качестве альтернативы вы можете включить режим автосоединения (который по умолчанию отключен). Каждое утверждение эффективно выполнялось бы в отдельной транзакции. Это контролируется опцией «hibernate.connection.autocommit». Подробнее здесь:

+0

Нет никаких указаний на то, что он использует Hibernate вообще. Это может быть сложнее, чем он может справиться. – duffymo

+0

его спящий режим, да, именно поэтому я отметил его как таковой :) – mrblah

+0

Будьте осторожны с этим catch-clause там, вы потеряете выполнение в случае отказа к откату(). Обходным решением будет исключение журнала перед попыткой отката. – whiskeysierra

2

Так закодировать это таким образом:

// connection is passed into the method. 
try 
{ 
    connection.setAutoCommit(false); 
    PreparedStatement ps = connection.prepareStatement(...); 
    // bind variables 
    for (Collection stuff : stuffList) 
    { 
     // save repeatedly 
    } 
    connection.commit(); 
} 
catch (SQLException e) 
{ 
    DatabaseUtils.rollback(connection); 
} 
finally 
{ 
    DatbaseUtils.close(statement); 
    DatabaseUtils.close(connection); 
} 

Сделок являются сквозным беспокойством. Лучше не иметь такой транзакционной логики внутри вашего уровня стойкости, особенно если несколько объектов доступа к данным должны участвовать в одной единице работы.

Смежные вопросы