2

我的 Web 应用程序中有两个数据源。我得到了连接dataSource1.getConnection();

我的问题是考虑下面的代码:

Connection connection = null;
connection = dataSource1.getConnection();
connection = dataSource2.getConnection();
connection.close();

我正在获得dataSource1连接并立即将dataSource2连接分配给连接变量。

当我关闭dataSource2连接时,dataSource1连接是否保持打开状态?还是我需要做如下?

Connection connection = null;
connection = dataSource1.getConnection();
connection.close();
connection = dataSource2.getConnection();
connection.close();
4

3 回答 3

2

第二个例子是对的,第一个例子会留下一个开放的连接。此外,您应该始终关闭块内的资源(在这种情况下为连接)finally,例如:

Connection connection = null;

try {
    connection = dataSource1.getConnection();
} catch (SQLException e) {
    // handle exception
} finally {
    try {
        connection.close();
    } catch (SQLException e) {
        // handle exception
    }   
}

try {
    connection = dataSource2.getConnection();
    connection.close();
} catch (SQLException e) {
    // handle exception
} finally {
    try {
        connection.close();
    } catch (SQLException e) {
        // handle exception
    }
}
于 2012-05-08T15:32:46.230 回答
1

您需要按照您在第二个代码示例中所示的方式进行操作。

在第一种情况下,垃圾收集器可能会为您清理混乱(在未定义的时间之后)并关闭您失去引用的连接(前提是 JDBC 驱动程序供应商在其实现finalize方法中实现了适当的逻辑Connection),但是依靠这种情况发生被认为是非常糟糕的做法。

于 2012-05-08T15:26:59.743 回答
0

该类Connection实现了AutoClosable接口,该接口定义了“不再需要时必须关闭的资源”。因此连接对象被定义为需要调用它们的close()方法才能被正确管理。

另一方面,该Connection.close()方法被记录为“立即释放 Connection 对象的数据库和 JDBC 资源,而不是等待它们自动释放”。这意味着在某处连接资源最终将被自动释放。

不过,总的来说,我会说最好明确关闭您不再需要的任何连接。

于 2012-05-08T17:03:32.170 回答