我只是想知道数据库连接池的概念以及它是如何实现的。


当前回答

图片胜过千言万语(paxdiablo给出了一个很棒的描述):

其他回答

数据库连接池是一种用于保持数据库连接打开的方法,以便其他人可以重用它们。

通常,打开数据库连接是一项昂贵的操作,特别是如果数据库是远程的。您必须打开网络会话、进行身份验证、检查授权等等。池化将使连接保持活动状态,以便在稍后请求连接时,优先使用一个活动连接,而不必创建另一个连接。

以下几段请参考下图:

  +---------+
  |         |
  | Clients |
+---------+ |
|         |-+  (1) +------+ (3) +----------+
| Clients | ==#==> | Open | ==> | RealOpen |
|         |   |    +------+     +----------+
+---------+   |       ^
              |       |(2)
              |    /------\     +---------+ (6) +-----------+
              |    | Pool | --> | Cleaner | ==> | RealClose |
              |    \------/     +---------+     +-----------+
          (4) |       ^
              |       |(5)
              |    +-------+
              #==> | Close |
                   +-------+

在最简单的形式中,它只是一个API调用(1)到一个类似于“真正的”RealOpen的Open API调用。它首先检查池中是否有合适的连接(2),如果有,就把连接给客户端。否则,将创建一个新的(3)并给客户端。

“合适的连接”只是一个已经使用正确的信息(例如数据库实例、凭据和可能的其他东西)访问数据库的连接。

类似地,有一个Close API调用(4),它实际上并不调用真正的RealClose,而是将连接放回池(5)中以供以后使用。在某些时候,池中的连接可能会被关闭(6)。这可以通过一个线程来完成,该线程会持续监视池,并在它们足够旧或满足某些其他条件时调用RealClose。

这是一个相当简单的解释。真正的实现可能更加复杂,例如前面提到的:

处理连接到多个服务器和使用多个用户帐户; 使用任意规则来决定何时应该真正关闭连接,比如它的年龄,有多少个类似的连接,等等。


数据库连接池是一种更普遍的情况,即维护缓存的内容,而这些内容的启动成本可能很高。正如您从我的类似回答中看到的,它也可以应用于线程池(或备份磁带、通信设备、激光切割机或其他数十种不同东西的池)。

在所有情况下,最好是“昂贵”地将另一种资源上线,而不是使用以前已经上线的资源。

链接的答案还显示了一种可能的算法,用于决定何时启动或(完全)关闭资源。

连接池的概念不仅存在于Java中,而且存在于许多编程语言中。创建一个新的连接对象成本很高,因此在创建虚拟池的生命周期中建立和维护固定数量的连接 Java Just (http://javajust.com/javaques.html)请参见本页的第14题

数据库连接池只是缓存到数据库的连接,以便下次可以重用它们,以减少每次我们想要连接到数据库时建立新连接的成本。

顾名思义。如果几个人想游泳,他们可以在同一个游泳池游泳,每次有人加入就建造一个新的游泳池真的有意义吗?时间和成本是优先考虑的。

图片胜过千言万语(paxdiablo给出了一个很棒的描述):