gpt4 book ai didi

java - 如何在退出类的任何方法时自动释放连接?

转载 作者:行者123 更新时间:2023-11-29 08:34:38 24 4
gpt4 key购买 nike

因此,这里有一些背景信息:我目前在一家提供 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com