Обработка исключений времени выполнения в транзакционном коде jdbc - PullRequest
2 голосов
/ 23 августа 2011

У нас с коллегой возникли разногласия относительно наилучшей практики обработки исключений времени выполнения, возникающих из транзакционного кода JDBC. Он чувствует, что ловить Exception вместо SQLException - правильная практика.

Его аргумент в том, что Connection.close(); ведет себя неопределенно, если транзакция не была совершена. Некоторые реализации JDBC могут выполнять откат, в то время как другие могут выполнять фиксацию. Если вы просто перехватите SQLException, то любое исключение во время выполнения будет иметь неопределенное поведение для close() в блоке finally.

В настоящее время считается лучшей практикой ловить Exception, а если нет, как вы решаете ситуацию, которую он описывает?

Connection connection = null;
try {
    connection = ...
    // transactional code
} catch (final Exception e) {
    connection.rollback();
} finally {
    // close other resources
    if (connection != null) { connection.close(); }
}

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Согласно Javadoc java.sql.Connection, поведение закрытия зависит от реализации.

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

Безопасно отлавливать и принимать решение для фиксации / отката на основе бизнес-требований

0 голосов
/ 23 августа 2011

Я бы тоже поймал Exception и даже Throwable. Все зависит от кода внутри вашего блока.

Ex:

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

Вы должны задать этот вопрос себе: хочу ли я зафиксировать trx, даже если произойдет не исключение SQLException?

Исходя из моего опыта, мой ответ был бы Нет! ; -)

Но это только я.

Привет

...