处理事务性jdbc代码中的运行时异常

时间:2011-08-23 19:28:17

标签: jdbc exception-handling transactions

一位同事和我对处理从事务性JDBC代码抛出的运行时异常的最佳实践存在分歧。他觉得捕捉异常而不是SQLException是正确的做法。他的论点是Connection.close();如果事务尚未提交,则具有未定义的行为。某些JDBC实现可能会执行回滚,而其他JDBC实现可能会执行提交。如果你只是捕获SQLException,那么任何运行时异常都会在finally块中的close()上有未定义的行为。

目前被认为是捕获异常的最佳做法,如果不是,您如何解决他描述的情况?

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

2 个答案:

答案 0 :(得分:0)

我也会抓住Exception,甚至是Throwable。这一切都取决于你的块内的代码。

例如:

如果你调用另一个DAO来持久保存另一个实体,你肯定会捕获任何类型的异常,以确保你回滚你的trx。

你必须向自己提出这个问题:即使出现了一些非SQLException,我还想提交trx吗?

根据我的经验,我的答案是否定的! ; - )

但那只是我。

此致

答案 1 :(得分:0)

根据java.sql.Connection的Javadoc,close的行为取决于实现。

强烈建议明确表示应用程序 在调用之前提交或回滚活动事务 close方法。如果调用close方法  并且存在活动事务,结果是实现定义的。

根据业务需求捕获并决定提交/回滚是安全的