我目前正在学习连接池概念。我浏览了 Oracle 网站中的官方文档,其中介绍了数据源和连接池。
在文档中提到:
当实现 DataSource 接口以与 ConnectionPoolDataSource 实现一起使用时,该 DataSource 类的实例生成的所有连接将自动成为池连接。
上面的说法没问题。简而言之,连接池由开放连接(PooledConnection)对象组成,可以通过 DataSource.getConnection() 方法访问这些对象。
PooledConnection接口文档中提到
PooledConnection 对象表示与数据源的物理连接。当应用程序调用 DataSource.getConnection 方法时,它会返回一个 Connection 对象。如果正在完成连接池,则该 Connection 对象实际上是 PooledConnection 对象的句柄,它是一个物理连接。
PooledConnection对象如何提供java.sql.Connection对象?我知道 PooledConnection 接口中有一个方法
getConnection()
提供 Connection 对象,但在文档中它被提到为:
当应用程序调用方法 DataSource.getConnection 并且池中没有 PooledConnection 对象可用时,连接池管理器将调用此方法。
如果Pool中已经存在一个PooledConnection对象那么如何获取Connection对象以及当调用Datasource.getConnection()并且存在PooledConnection对象时PooledConnection如何提供java.sql.Connection对象存在于池中? Connection 对象实际上如何成为 PooledConnection 对象的句柄?这真的很令人困惑,文档也不清楚。
当您调用
DataSource.getConnection
时,数据源实现知道如何与连接池管理器对话,并要求它提供连接:
Connection
和 PooledConnection
实例之间的关系(我认为)依赖于驱动程序。它们可以由单个对象表示,或者两个概念可以有单独的实现类。但您的代码不需要知道这一点。理想情况下,它根本不应该依赖于驱动程序实现类......因为这意味着您的代码与驱动程序实现“耦合”。
(文档没有明确说明这一点,因为它们试图避免不必要的约束驱动程序实现。这是一件好事。)