我只是想知道数据库连接池的概念以及它是如何实现的。
当前回答
图片胜过千言万语(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给出了一个很棒的描述):
源
推荐文章
- 将值从同一表中的一列复制到另一列
- 什么是数据库池?
- 关于数据库,每个开发人员应该知道些什么?
- "where 1=1"语句
- 是使用各有一个模式的多个数据库更好,还是使用一个数据库有多个模式更好?
- 如何从Oracle的表中获取列名?
- 如何检查表上持有哪些锁
- 在MongoDB中查找重复的记录
- 模式、表和数据库之间的区别是什么?
- 我看到VARCHAR(255)如此频繁地使用(而不是其他长度),有什么好的原因吗?
- 使用pgadmin连接到heroku数据库
- Delete_all vs destroy_all
- 我如何移动一个redis数据库从一个服务器到另一个?
- 如何首次配置postgresql ?
- 数据库性能调优有哪些资源?