1

当结果集关闭时,语句会发生什么?

    Statement stmt = null;
    ResultSet rs = null;

    try {
        stmt = con.createStatement();
        rs = stmt.executeQuery(query.toString());
        ...
    }

    // lots of code

    rs.close()

注意:当 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,生成它的 Statement 对象会自动关闭 ResultSet 对象。

但是当 ResultSet 首先关闭时会发生什么?

对于什么,首先应该发生什么?

4

3 回答 3

6

您应该以与创建对象相反的顺序关闭对象。所以首先是ResultSet,然后是Statement,最后是Connection

如果您不关闭Statement它,它将保持打开状态,您可以使用它执行另一个查询(如果它是 aPreparedStatement或者CallableStatement您能够更改查询参数)。

另请注意,您引用的是 JDBC 规范,它的实现取决于 JDBC 驱动程序提供程序。通常,您不应该信任它们,并手动关闭这些对象。

另一件事-我认为更重要-如果您使用连接池(例如在 JBoss 上),关闭连接只会将其释放回池中,而不会释放底层对象。因此,建议始终手动释放您创建的所有对象。

于 2012-06-06T22:18:48.567 回答
2

Statement实际上可以重复使用。虽然如果您重复相同的查询,您应该使用 aPreparedStatement代替,因为查询将被编译一次。

当您完成它们时,它们当然应该关闭,但关闭ResultSet并不会自动关闭它们Statement

于 2012-06-06T22:22:06.643 回答
1

声明没有任何反应——它保持打开状态。您可以根据需要继续使用该语句,但请务必在完成后将其关闭。

于 2012-06-06T22:21:52.333 回答