我的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();
答案 0 :(得分: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
}
}
答案 1 :(得分:1)
您需要按照第二个代码示例中的说明进行操作。
在第一种情况下,垃圾收集器可能为您清理混乱(在未定义的时间之后)并关闭您丢失引用的连接(提供JDBC驱动程序供应商)在他们的finalize
实现的Connection
方法中实现了适当的逻辑,但是依靠这种情况被认为是非常不良做法。
答案 2 :(得分:0)
Connection
类实现AutoClosable
接口,该接口定义了在不再需要时必须关闭的资源"。因此,连接对象被定义为需要调用其close()
方法才能正确管理。
另一方面,Connection.close()
方法记录为"立即释放Connection对象的数据库和JDBC资源,而不是等待它们自动释放"。这意味着最终会自动释放连接资源。
总的来说,我会说明确关闭您不再需要的任何连接会更好。