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

Sri*_*ram 9 java connection jdbc resultset

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

.close()方法调用之前,我从这两个不同的连接中获得了相关StatementResultSet对象.获得这两个对象后不久,如果我说connection1.close()(通过DriverManager.getConnection()),它将使连接对象无效,我不应该/允许访问相关的Statement和ResultSet对象.如我错了请纠正我?

第二种情况,现在,如果我说connection2.close()(通过DataSource.getConnection()),它只是将它返回到池中.但这种联系仍然存在.我能够访问关联StatementResultSet对象吗?

Mar*_*eel 6

如果我们假设(基本)DataSource(即:不进行连接池的那个),那么您获得的物理连接与从DriverManager(从某些驱动程序内部使用DataSource中的DriverManager或来自DriverManager的DataSource )获得的物理连接相同).所以那些连接的行为会相同.

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

当用户从DataSource请求连接时,DataSource将检出PooledConnection,并询问它Connection.然后,PooledConnection将创建使用或包装物理连接的逻辑连接(例如,使用代理).DataSource将该逻辑连接返回给用户.

对于用户,逻辑连接应该在所有方面与物理连接相同.因此,当用户关闭连接时,该逻辑连接和所有相关的JDBC对象将被关闭,并且行为与物理连接关闭相同.

JDBC 4.1第11.1节说:

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

第11.4节:

如果应用程序尝试重用逻辑句柄,则Connection实现将抛出SQLException.

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

然而,在后台,当逻辑连接关闭时,PooledConnection将向DataSource发出可供重用的信号,然后DataSource将其返回到连接池,或关闭PooledConnection(关闭物理连接),如果它不再需要连接.

通过要求PooledConnection关闭逻辑连接,DataSource还可以强制撤销用户的连接(例如,当连接签出时间过长等).