我只是想知道数据库连接池的概念以及它是如何实现的。
数据库连接池是一种用于保持数据库连接打开的方法,以便其他人可以重用它们。
通常,打开数据库连接是一项昂贵的操作,特别是如果数据库是远程的。您必须打开网络会话、进行身份验证、检查授权等等。池化将使连接保持活动状态,以便在稍后请求连接时,优先使用一个活动连接,而不必创建另一个连接。
以下几段请参考下图:
+---------+
| |
| 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题
推荐文章
- 获得PostgreSQL数据库中当前连接数的正确查询
- MySQL数据库表中的最大记录数
- 从现有模式生成表关系图(SQL Server)
- HyperLogLog算法是如何工作的?
- 数据库和模式的区别
- 如何从命令行在windows中找到mysql数据目录
- 如何找到MySQL的根密码
- 将表从一个数据库复制到另一个数据库的最简单方法?
- 什么是分片,为什么它很重要?
- 数据库触发器是必要的吗?
- 为什么我应该使用基于文档的数据库而不是关系数据库?
- 哪个更快/最好?SELECT *或SELECT columnn1, colum2, column3等
- 将值从同一表中的一列复制到另一列
- 什么是数据库池?
- 关于数据库,每个开发人员应该知道些什么?