如果我们假设一个(基本的)DataSource
(即:一个不做连接池的),那么您获得的物理连接与从DriverManager
(一些驱动程序甚至在内部使用来自 DataSource 的 DriverManager 或来自 DriverManager 的 DataSource )。因此,这些连接的行为将相同。
现在,如果我们假设 aDataSource
提供连接池,那么 DataSource 本身使用 a ConnectionPoolDataSource
(或类似的内部机制)来获取 a 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(关闭物理连接)不再需要连接。
DataSource 还可以通过要求 PooledConnection 关闭逻辑连接来强制撤销用户的连接(例如,当连接签出时间过长时等)。