一位同事和我对处理从事务性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(); }
}
答案 0 :(得分:0)
我也会抓住Exception,甚至是Throwable。这一切都取决于你的块内的代码。
例如:
如果你调用另一个DAO来持久保存另一个实体,你肯定会捕获任何类型的异常,以确保你回滚你的trx。
你必须向自己提出这个问题:即使出现了一些非SQLException,我还想提交trx吗?
根据我的经验,我的答案是否定的! ; - )
但那只是我。
此致
答案 1 :(得分:0)
根据java.sql.Connection的Javadoc,close的行为取决于实现。
强烈建议明确表示应用程序
在调用之前提交或回滚活动事务
close
方法。如果调用close
方法
并且存在活动事务,结果是实现定义的。
根据业务需求捕获并决定提交/回滚是安全的