Java 连接关闭

Java 连接关闭,java,jdbc,connection,Java,Jdbc,Connection,使用getConnection()方法初始化连接。我知道,我可以用 try (Connection conn = getConnection()) { ... Target t = new Target(conn); ... } 在Java7中,使用该连接并在尝试结束时自动关闭它。但是,如果我不尝试就使用以下代码,会发生什么呢 Target t = new Target(getConnection()); 这是否会造成资源泄漏,因为我无法关闭连接,因为我没有连接的变量

使用getConnection()方法初始化连接。我知道,我可以用

try (Connection conn = getConnection()) {
    ...
    Target t = new Target(conn);
    ...
}
在Java7中,使用该连接并在尝试结束时自动关闭它。但是,如果我不尝试就使用以下代码,会发生什么呢

Target t = new Target(getConnection());

这是否会造成资源泄漏,因为我无法关闭连接,因为我没有连接的变量

如果您在使用代码时没有使用try with resources(或老式的try finally with explicit close),那么很明显,所示代码不会关闭连接。因此,除非
Target
以某种方式关闭连接,否则在这种情况下将出现资源泄漏

请注意,即使在使用try with resources时,即使连接关闭,也可能存在内存泄漏。如果连接保存在
Target
的实例字段中,并且目标的生命周期长于try with resources块,则可能会发生这种情况,因为在这种情况下,在目标本身符合垃圾收集条件之前,垃圾收集器无法回收连接(以及连接所保存的任何其他对象)


作为资源管理的一般经验法则,创建资源的人也负责关闭该资源(除非另有明确说明),因此,除非您有很好的理由不这样做,否则您应该在此处使用try with resources。

是的,您是正确的,这将导致资源泄漏。java中的连接接口扩展了AutoCloseable接口,该接口表示“不再需要时必须关闭的资源”。因此,在代码中完成后,必须显式关闭连接(或者使用免费的try with resources)

请注意您正在传递的try with资源块中的情况
目标t=新目标(conn);内存泄漏的变化很小,而不是连接泄漏。

是的,正是您所说的。将
连接
传递给
目标
的实例,即使您关闭连接,也可能会造成内存泄漏,这取决于
目标
的功能和它的寿命。只需要在这里对第二段进行一些说明。泄漏只是GC无法获取的剩余引用,对吗?@AxelH是的,但根据涉及的JDBC驱动程序,可能会涉及更多内容(引用和连接中的其他字段),目标无法在try with resources块之外引用,我认为它将被GC销毁。你的意思是我应该为Target实现java.lang.AutoCloseable,并在autoclose期间将Target的连接实例变量设置为null吗?@Andre如果
Target
没有使用不必要的资源超出try,它将由GC回收。是的,通过引用,我指的是链接到它的所有内容。我当时正确地理解了你的观点。