什么是数据库池?

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

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

database database-connection connection-pooling
5个回答
348
投票

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

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

接下来几段请参考下图:

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

最简单的形式是,它只是对

Open
API 调用的 API 调用 (1),这与“真实”的
RealOpen
类似。首先检查池中是否有合适的连接 (2),如果有可用,则将其提供给客户端。否则,将创建一个新的 (3) 并将其提供给客户。

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

类似地,有一个

Close
API 调用 (4),它实际上并不调用 real
RealClose
,而是将连接放回池 (5) 以供以后使用。在某些时候,池中的连接可能“实际上”关闭 (6)。这可以通过一个线程来完成,该线程连续监视池并在池足够老或满足某些其他条件时调用 RealClose
这是一个非常简单的解释。实际的实现可能会更加复杂,例如前面提到的:

处理与多个服务器的连接并使用多个用户帐户;
  • 使用任意规则来决定何时应该真正关闭连接,例如其年龄、有多少相似的连接等等。
数据库连接池是更一般情况下的一种特殊情况,即维护缓存的事物,而它们的启动成本可能很高。正如您从
我的类似答案

中看到的那样,它也适用于线程池(或备份磁带池、通信设备、激光切割机或许多其他不同的东西)。 在所有情况下,如果将另一种资源上线“成本较高”,而不是使用之前已上线的资源,那么最好是这样。

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


165
投票

alt text

来源


44
投票


19
投票


3
投票
http://javajust.com/javaques.html

) 请参阅本页上的问题 14

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