- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,这里有一些背景信息:我目前在一家提供 SaaS 的公司工作,我的工作涉及使用 JDBC 编写方法来检索和处理数据库中的数据。这是问题所在,大多数方法都带有特定的模式来管理连接:
public Object someMethod(Object... parameters) throws MyCompanyException{
try{
Connection con = ConnectionPool.getConnection();
con.setAutoCommit(false);
// do something here
con.commit();
con.setAutoCommit(true);
}
catch(SomeException1 e){
con.rollback();
throw new MyCompanyException(e);
}
catch(SomeException2 e){
con.rollback();
throw new MyCompanyException(e);
}
// repeat until all exception are catched and handled
finally {
ConnectionPool.freeConnection(con);
}
// return something if the method is not void
}
公司已经把所有的方法都这样做了,这样一旦发现异常,方法就会回滚所有的改变,连接也会尽快释放。然而,有时我们中的一些人可能会在编码时忘记做一些常规的事情,例如在发生错误时释放连接或回滚,并且在我们的客户投诉之前这种错误不太容易被发现。所以我决定让这些例行的事情自动完成,即使它没有在方法中声明。对于连接的发起和建立,可以很容易地使用构造函数来完成。
public abstract SomeAbstractClass {
protected Connection con;
public SomeAbstractClass() {
con = CoolectionPool.getConnection();
con.setAutoCommit(false);
}
}
但真正的问题是在完成该方法后立即自动释放连接。我考虑过使用 finalize()
这样做,但这不是我要找的,因为 GC 调用了 finalize()
,这意味着它可能不会在方法完成时完成我的对象,即使永远不会引用该对象。 finalize()
仅在 JVM 真正耗尽内存无法继续运行时调用。
当该方法完成其工作时,有没有办法立即自动释放我的连接?
最佳答案
使用“尝试资源”。这是一种编程模式,您可以编写一个典型的 try - catch
block ,如果出现任何问题或您退出它,资源将被关闭。
try (Connection con = ConnectionPool.getConnection()) {
con.doStuff(...);
}
// at here Connection con is closed.
它通过 Connection
扩展 Closeable
来工作,如果 try 语句的“资源获取”部分中的任何类实现了 Closeable
,那么对象的 close()
方法将在控制从 try/catch block 中传递之前被调用。
这避免了在许多情况下使用 finally { ... }
的需要,并且实际上比大多数手写的 finally { ... }
block 更安全,因为它还容纳在 catch { ... }
和 finally { ... }
block 中抛出的异常,同时仍然关闭资源。
关于java - 如何在退出类的任何方法时自动释放连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45039634/
我是一名优秀的程序员,十分优秀!