在 try catch 中最终关闭数据库连接

Posted

技术标签:

【中文标题】在 try catch 中最终关闭数据库连接【英文标题】:Closing DB connection on finally in try catch 【发布时间】:2017-04-28 01:22:05 【问题描述】:

如果我们在一个方法中打开一个数据库连接,并且我们想确保在出现异常的情况下关闭连接,我们可以将 connection.close() 放在 finally 块中。我的问题是,如果关闭连接也会引发异常怎么办?这段代码应该是什么样子?

try 
    conn.open();
    //Do stuff with database
 catch (Exception e) 
    e.printStackTrace();
 finally 
    conn.close(); //Can potentially throw exception.

我一直将“抛出异常”作为方法的一部分。示例:

public void doSomethingWithDB() throws Exception 
    //Method Body

如果在conn.close() 上抛出异常,大多数情况下连接会自动关闭吗?或者流会保持开放?

关于更多上下文,我正在将 Apache Phoenix 与 HBase 一起使用,并遇到了这个问题,因为我试图成为一个更安全的编码器,而不是意外地保持对 HBase 的流开放。

【问题讨论】:

【参考方案1】:

close 引发的异常意味着有关连接关闭的某些事情不起作用。所以很可能并不是所有的东西都得到了正确的清理。但是,此时您可能无能为力。

通常的做法是有一个closeQuietly 帮助方法,该方法尝试尽可能地关闭并捕获任何异常(可能记录它们)。然后,您的应用程序将继续运行,就像 close 工作一样。

请注意,这样的助手甚至是必要的when you use a try-with-resources block。

【讨论】:

以上是关于在 try catch 中最终关闭数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

Java 在try—catch块之后的finally是干啥的?

using 和try/catch区别和注意点

java中try-catch模块中with语句块的作用

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表啥意

在 foreach 循环中使用 try-catch 块的最佳做法是啥? [关闭]

这个 try-catch-with-resourcers 会自动关闭吗? [复制]