【发布时间】:2023-03-26 13:30:02
【问题描述】:
我们已经编写了一个类,它打开了与服务器的连接。完成后,如果一切顺利,您需要告诉它commit,或者如果出现问题,则告诉它rollback。所以现在我们的代码中有很多地方看起来像这样:
OurConnectionClass conn = null;
try {
conn = OurConnectionClass(parameters);
// Do some stuff here...
conn.commit();
} catch (Throwable t) {
if (conn != null) {
conn.rollback();
}
throw t;
}
如果您忘记提交或回滚,不会立即出现问题,但最终您会耗尽连接池,然后必须找出错误的位置。
我想找到一种方法让OurConnectionClass 实现AutoClosable,所以我可以这样做:
try (OurConnectionClass conn = new OurConnectionClass(parameters)) {
// Do some stuff here...
}
我觉得必须有办法做到这一点,但我没有看到它。 AutoCloseable 仅调用 close 方法,没有传递任何参数。据我所知,无法知道是否调用 close 是因为成功到达 try 块的末尾还是抛出了异常。
【问题讨论】:
-
既然我已经把这一切都写完了,我想知道我是否应该使用匿名函数而不是尝试使用
try-with-resources?我可以让OurConnectionClass接收它并尝试运行它,如果它成功,它会在之后运行commit(),如果它失败,它将在之后运行rollback()...我可以让这是一个静态方法什么都不返回,而不是返回一个实例。这听起来可能比我想象的要复杂一些……在尝试之前,我会等着看其他人对此的看法…… -
AutoClosable你的意思是AutoCloseable?你能具体说明你指的是什么接口吗? -
注意,如果构造函数失败并抛出异常,则不会调用 close()。
-
根据JLS,您可以在处理异常的try-with-resource-block之后定义
catch-block。 -
@Leviand - 我认为从上下文(我说的是 Java 的 try-with-resource 的事实)应该很明显,我的意思是标准 Java 库中的
AutoCloseable接口,而不是第三方的东西。无论如何,你是对的,我在几个地方拼错了这个名字。我已经修好了。
标签: java try-with-resources autocloseable