【问题标题】:Try with resources using a connection pool and single connection尝试使用连接池和单个连接的资源
【发布时间】:2021-01-07 14:34:14
【问题描述】:

在代码审查期间,我发现了以下代码 sn-p:

try (
   Connection con = new SqlSessionFactoryBuilder()
    .build(configuration)
    .buildFactory()
    .openSession()
    .getConnection()
){
   // do stuff here with 'con' and not close anything   
}

Session、Connection、SqlSessionFactory 是 iBatis 的实现,但问题是对 Closable 接口的任何“堆叠”实现感兴趣。

我假设“尝试使用资源”关闭资源,即实例化 - con 在这种情况下。通常你会分别关闭会话和连接。如果使用上面的代码 close() 方法只会在 con 对象上被调用,所以 session 不是显式调用并将依赖垃圾回收?

使用以下代码会不会更好:

try (
   Session session = new SqlSessionFactoryBuilder()
    .build(configuration)
    .buildFactory()
    .openSession(); 
   Connection con = session.getConnection();
){
   // do stuff here with 'con' and not close anything
}

后一种方法在我看来似乎更干净,因为它应该正确调用 close()。还是我的解释有误,只是样板代码?

【问题讨论】:

  • 这可能是codereview 比 StackOverflow 更好的问题。就我而言,我认为您的想法是正确的,这可能是您应该在代码审查中提出并更改的内容 - 毕竟正是因为这个原因,才允许使用这种 try 语法。
  • 我认为它适合这里,因为它更多的是语言功能或语言机制问题,而不是代码抛光。感谢您的评论!

标签: java try-catch


【解决方案1】:

您的解释是正确的,try-with-resources 只会关闭在资源块中明确声明的资源。

但是,在大多数情况下,第一种方法也可以。这是因为通常当一些Closeable 使用另一个Closeable 时,它会尝试在其close() 方法内关闭它。这种机制与垃圾收集器没有任何关系(它只会删除一个对象而不释放资源)。

除了Closeable 不会关闭其资源的情况外,在第一种方法中也可能存在其他资源泄漏源。考虑以下情况:

try(BufferedInputStream bufferedInput = new BufferedInputStream(
                                            new FileInputStream("file.txt"))
)

在此示例中,将首先创建 FileInputStream。就在那时,它将被传递给BufferedInputStream 的构造函数。在创建BufferedInputStream 的过程中出现异常会怎样? FileInputStream 永远不会关闭。 另一方面,当您将它们声明为两个单独的资源时:

try(FileInputStream input = new FileInputStream("file.txt");
    BufferedInputStream bufferedInput = new BufferedInputStream(input)
)

Java 本身会确保这两个资源都将被关闭。以下在JSL - 14.20.3.1. Basic try-with-resources 中声明:

在管理多个资源的基本 try-with-resources 语句中:

如果资源的初始化突然完成,因为 抛出一个值 V,然后:

如果自动关闭所有初始化成功的资源 (可能为零)正常完成,然后 try-with-resources 由于值 V 的抛出,语句突然完成。

可能还有更多可能导致资源泄漏的情况。

【讨论】:

  • 感谢您的回答以及更适合我所指内容的示例!
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多