连接池和PooledConnection

问题描述 投票:0回答:1

我目前正在学习连接池概念。我浏览了 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 对象的句柄?这真的很令人困惑,文档也不清楚。

java database connection connection-pooling
1个回答
0
投票

当您调用

DataSource.getConnection
时,数据源实现知道如何与连接池管理器对话,并要求它提供连接:

  • 如果池中存在现有(空闲)数据库连接,池管理器将返回它(并将其标记为正在使用)。
  • 如果没有空闲连接,池管理器将创建物理连接并将其添加到池中(如正在使用中)并返回它。

Connection
PooledConnection
实例之间的关系(我认为)依赖于驱动程序。它们可以由单个对象表示,或者两个概念可以有单独的实现类。但您的代码不需要知道这一点。理想情况下,它根本不应该依赖于驱动程序实现类......因为这意味着您的代码与驱动程序实现“耦合”。

(文档没有明确说明这一点,因为它们试图避免不必要的约束驱动程序实现。这是一件好事。)

© www.soinside.com 2019 - 2024. All rights reserved.