如何解决为什么首先调用实现 Autoclosable 接口的类的 close 方法而不是 Sql 连接关闭?
我找到了在提交失败时回滚事务的解决方案,它运行良好。 但是你能解释一下为什么 Autorollback 对象关闭方法比连接关闭先调用吗?
自动回滚类:
public class AutoRollback implements AutoCloseable {
private Connection conn;
private boolean committed;
public AutoRollback(Connection conn){
this.conn = conn;
}
public void commit() throws sqlException {
conn.commit();
committed = true;
}
@Override
public void close() throws sqlException {
if(!committed) {
conn.rollback();
}
}
}
使用 Autorollback 的服务方法示例:
try(Connection connection = MysqLDAOFactory.getConnection();
AutoRollback autoRollback = new AutoRollback(connection)){
result = carDao.insertCar(connection,car);
autoRollback.commit();
} catch (sqlException | NamingException | MysqLEXContainer.MysqLDBExecutionException throwables) {
throw new ApplicationEXContainer.ApplicationCanNotChangeException(throwables.getMessage(),throwables);
}
为什么Autorollback的close方法有效?如果连接关闭了怎么调用rollback方法?所以唯一的解释就是autorollback close方法在connection close之前被调用了,但是为什么呢?
解决方法
因为这就是 JLS 所说的它必须起作用的方式:
try-with-resources 语句使用变量(称为资源)进行参数化,这些变量在执行 try 块之前初始化并自动关闭,与它们初始化的顺序相反,之后执行 try 块。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。