我只是想了解数据库连接池的概念以及它是如何实现的。
数据库连接池是一种用于保持数据库连接打开的方法,以便其他人可以重用它们。
通常,打开数据库连接是一项昂贵的操作,尤其是在数据库位于远程的情况下。您必须打开网络会话、进行身份验证、检查授权等等。池化使连接保持活动状态,以便稍后请求连接时,优先使用其中一个活动连接,而不是创建另一个连接。
接下来几段请参考下图:
+---------+
| |
| 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
。这是一个非常简单的解释。实际的实现可能会更加复杂,例如前面提到的:
处理与多个服务器的连接并使用多个用户帐户;
中看到的那样,它也适用于线程池(或备份磁带池、通信设备、激光切割机或许多其他不同的东西)。 在所有情况下,如果将另一种资源上线“成本较高”,而不是使用之前已上线的资源,那么最好是这样。
该链接的答案还显示了一种可能的算法,用于决定何时启动或(完全)关闭资源。