Java 连接行为-DriverManager.getConnection()和DataSource.getConnection()

Java 连接行为-DriverManager.getConnection()和DataSource.getConnection(),java,jdbc,connection,resultset,Java,Jdbc,Connection,Resultset,如果我使用DriverManager.getConnection()和DataSource.getConnection()获取连接对象,当对这些对象调用.close()时,它们的行为有何不同 在调用.close()方法之前,我从这两个不同的连接中获得了相关的语句和结果集对象。获取这两个对象后不久,如果我说connection1.close()(通过DriverManager.getConnection()),它将使连接对象无效,并且我不应该/不允许访问相关语句和结果集对象。如果我错了,请纠正我好

如果我使用
DriverManager.getConnection()
DataSource.getConnection()
获取连接对象,当对这些对象调用
.close()
时,它们的行为有何不同

在调用
.close()
方法之前,我从这两个不同的连接中获得了相关的
语句
结果集
对象。获取这两个对象后不久,如果我说
connection1.close()
(通过
DriverManager.getConnection()
),它将使连接对象无效,并且我不应该/不允许访问相关语句和结果集对象。如果我错了,请纠正我好吗

第二种情况,现在如果我说
connection2.close()
(通过
DataSource.getConnection()
),它只是将其返回到池中。但这种联系仍然存在。我是否能够访问相关的
语句
结果集
对象

connection1.close()(通过DriverManager.getConnection())

这将关闭与数据库和所有资源建立的物理连接,即。结果集、语句、连接被释放。因此,您无法在连接关闭后访问它们

connection2.close()(通过DataSource.getConnection())

这取决于数据源实现,因此不同数据源实现之间的行为不需要一致。此外,在给定的数据源实现中,连接的实际生命周期取决于各种其他参数,强烈建议不要将此连接与通过DriverManager获得的连接区分开来


如果您确实希望在关闭
语句
连接
后,
结果集
中保存的数据可用,您可以查看这是否适合您的用例。

客户端缓存可能取决于用于连接的驱动程序不确定。 但有些驱动程序特别禁止您在连接关闭后使用语句或结果集。其他人在客户端维护结果集

如果我们假设一个(基本)
数据源
(即:一个不进行连接池的数据源),那么您将获得一个与从
DriverManager
获得的物理连接相同的连接(有些驱动程序甚至在内部使用数据源中的DriverManager,或DriverManager中的数据源)。因此,这些连接的行为相同

现在,如果我们假设一个提供连接池的
数据源
,那么数据源本身使用一个
ConnectionPoolDataSource
(或类似的内部机制)来获得一个
PooledConnection
。这个PooledConnection管理到数据库的实际物理连接

当用户从数据源请求连接时,数据源将签出PooledConnection,并要求它提供
连接
。PooledConnection随后将创建使用或包装物理连接的逻辑连接(例如使用代理)。数据源将向用户返回该逻辑连接

对于用户来说,逻辑连接在各个方面的行为都应该与物理连接相同。因此,当用户关闭连接时,该逻辑连接和所有依赖的JDBC对象都将关闭,并且行为与物理连接关闭相同

JDBC 4.1第11.1节规定:

连接池对客户机是完全透明的:客户机获得池连接 连接和使用它的方式与获取和使用非池连接的方式相同

第11.4节:

如果应用程序试图重用逻辑句柄,则连接实现 抛出一个SQLException

对于给定的PooledConnection对象,只有最近生成的逻辑连接对象才有效。调用关联的PooledConnection.getConnection方法时,将自动关闭以前存在的任何连接对象

但是,在后台,当逻辑连接关闭时,PooledConnection将向数据源发出信号,表明它可以重用,然后数据源将其返回到连接池,或者如果不再需要连接,则关闭PooledConnection(关闭物理连接)


数据源还可以通过请求PooledConnection关闭逻辑连接来强制撤销用户的连接(例如,当一个连接被签出的时间过长等)。

从连接池获得的逻辑连接应该(对用户)起作用与从DriverManager获得的物理连接完全相同。因此,对于用户来说,即使物理连接保持打开状态,连接和所有依赖对象也应该是关闭的。如果数据源实现的行为不符合JDBC规范,那么它就不符合JDBC规范。在我的应用程序中,我可以访问我的
结果集
对象,即使我关闭了我的
连接
对象。因此,正如您所注意到的,Websphere实现失败了?这取决于您对access的意思。ResultSet对象仍然存在,但您不应该能够使用ResultSet,因为在逻辑连接关闭时它本应关闭。如果它是不正确的t WebSphere的实现:这取决于您使用什么作为WebSphere的
数据源的
ConnectionPoolDataSource
。我描述的行为应该由
PooledConnection
实现来实施。