gpt4 book ai didi

java - 为什么此代码不关闭 JDBC 连接? (Java 7 可自动关闭的意外行为)

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:52 25 4
gpt4 key购买 nike

使用 Java 7u5 和 try-with-resources 结构,以下代码似乎会泄漏 jdbc 连接:

try (Connection connection = ..; PreparedStatement stmt = ..) {
stmt.setString(..);
return stmt.executeUpdate() > 0;
}

下一段代码按预期和预期工作:

int ret = 0;

try (Connection connection = ..; PreparedStatement stmt = ..) {
stmt.setString(..);
ret = stmt.executeUpdate();
}

return ret > 0;

似乎在第一种情况下,Connection.close() 方法没有被调用。

我正在使用最新的 mysql 连接器。这是意外行为,对吗?

测试

以下测试不会打印CLOSED:

public class Test implements AutoCloseable {

public static void main(String[] args) throws Exception {
System.out.println(doTest());
}

private static boolean doTest() throws Exception {
try (Test test = new Test()) {
return test.execute() > 0;
}

}

private int execute() {
return 1;
}

@Override
public void close() throws Exception {
System.out.println("CLOSED");
}
}

奇怪的是,如果 execute() 被修改为 return 0; 那么 CLOSED WILL 会被打印出来。

javap -p -c 测试类输出

    Compiled from "Test.java"
public class Test implements java.lang.AutoCloseable {
public Test();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
3: invokestatic #27 // Method doTest:()Z
6: invokevirtual #31 // Method java/io/PrintStream.println:(Z)V
9: return

private static boolean doTest() throws java.lang.Exception;
Code:
0: aconst_null
1: astore_0
2: aconst_null
3: astore_1
4: new #1 // class Test
7: dup
8: invokespecial #39 // Method "<init>":()V
11: astore_2
12: aload_2
13: invokespecial #40 // Method execute:()I
16: ifle 21
19: iconst_1
20: ireturn
21: iconst_0
22: aload_2
23: ifnull 30
26: aload_2
27: invokevirtual #44 // Method close:()V
30: ireturn
31: astore_0
32: aload_2
33: ifnull 40
36: aload_2
37: invokevirtual #44 // Method close:()V
40: aload_0
41: athrow
42: astore_1
43: aload_0
44: ifnonnull 52
47: aload_1
48: astore_0
49: goto 62
52: aload_0
53: aload_1
54: if_acmpeq 62
57: aload_0
58: aload_1
59: invokevirtual #47 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
62: aload_0
63: athrow
Exception table:
from to target type
12 22 31 any
30 31 31 any
4 42 42 any

private int execute();
Code:
0: iconst_1
1: ireturn

public void close() throws java.lang.Exception;
Code:
0: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #55 // String CLOSED
5: invokevirtual #57 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}

最佳答案

升级到最新版本的eclipse(Juno)后,这种奇怪的行为就不再发生了。

使用命令行编译运行也能正常工作。

我怀疑 Eclipse Indigo 使用旧的 javac 进行编译,并且没有提示任何违规行为。

关于java - 为什么此代码不关闭 JDBC 连接? (Java 7 可自动关闭的意外行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11497070/

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