0

几个月前,我了解到在使用时java.sql.connection我需要关闭PreparedStatementsResultSet防止内存泄漏,如此处所述

然而,我最近开始与一个新团队合作,该团队使用org.sql2o.connection了一个很好且有用的 jdbc 包装器,但我注意到他们通常不会关闭他们的org.sql2o.Query对象。

try(org.sql2o.Connection c = Sql2oObject.open()){
    //...some logic
    List<SomeClass> list = c.createQuery(sql).executeAndFetch(SomeClass.class);
    //...some more logic
}

如您所见,查询对象从未显式关闭。我认为关闭查询会更好:

try(org.sql2o.Connection c = sql2oObject.open();
    org.sql2o.Query q = c.createQuery(sql); ) {
    //...some logic
    List<SomeClass> list = q.executeAndFetch(SomeClass.class);
    //...some more logic
}

但我不确定是否真的有必要。如果是,那么我已经发现了一个可能的重大泄漏,我将被视为天才,并被永远铭记。如果不是,那么我只是一个要求进行不必要更改的人。

那么,你怎么说哦,强大的SO?有必要关闭它们吗?

4

1 回答 1

0

实际上,您不必像在 Java 中通过try-with-resourcesql2o.connection方法使用它一样调用 close 。

它在 try-with-resource java 中所做的是编译器finally为您的代码添加语句,您应该在其中显式关闭本机资源。否则,您必须关闭 sql2o.connectionfinally 块的内部。由于它是围绕标准的 jdbc 包装器jdbc connection

如果您还想使用 try-with-resource 关闭其他下划线资源,请在括号中声明它们。这样它将关闭下划线资源以及您的主要资源。但是,在您的情况下Query,不需要明确关闭,因为它始终是sql2o.connection

于 2020-11-12T04:40:54.817 回答