我只是想知道数据库连接池的概念以及它是如何实现的。
数据库连接池是一种用于保持数据库连接打开的方法,以便其他人可以重用它们。
通常,打开数据库连接是一项昂贵的操作,特别是如果数据库是远程的。您必须打开网络会话、进行身份验证、检查授权等等。池化将使连接保持活动状态,以便在稍后请求连接时,优先使用一个活动连接,而不必创建另一个连接。
以下几段请参考下图:
+---------+ | | | Clients | +---------+ | | |-+ (1) +------+ (3) +----------+ | Clients | ==#==> | Open | ==> | RealOpen | | | | +------+ +----------+ +---------+ | ^ | |(2) | /------\ +---------+ (6) +-----------+ | | Pool | --> | Cleaner | ==> | RealClose | | \------/ +---------+ +-----------+ (4) | ^ | |(5) | +-------+ #==> | Close | +-------+
在最简单的形式中,它只是一个API调用(1)到Open API调用,类似于"real"1、RealOpen。它首先检查池中是否有合适的连接(2),如果有,就把连接给客户端。否则,将创建一个新的(3)并给客户端。
Open
RealOpen
“合适的连接”;只是一个已经有访问数据库使用正确的信息(如数据库实例,凭据,和可能的其他东西)。
类似地,有一个Close API调用(4),它实际上并不调用真正的 RealClose,而是将连接放回池(5)以供以后使用。在某些时候,池中的连接可能被实际上关闭(6)。这可以通过一个线程来完成,该线程持续监视池并在它们足够老或满足某些其他条件时调用RealClose。
Close
RealClose
这是一个相当简单的解释。真正的实现可能更加复杂,例如前面提到的:
数据库连接池是一种更普遍的情况,即维护缓存的内容,而这些内容的启动成本可能很高。正如你从我也有类似的回答中看到的,它也可以应用于线程池(或备份磁带、通信设备、激光切割机或其他几十种不同东西的池)。
在任何情况下,最好是“昂贵”;使另一种资源联机,而不是使用以前联机的资源。
链接的答案还显示了一种可能的算法,用于决定何时启动或(完全)关闭资源。
图片胜过千言万语(paxdiablo给出了一个很棒的描述):
< a href = " http://ejbvn.wordpress.com/category/week-2-entity-beans-and-message-driven-beans/day-09-using-jdbc-to-connect-to-a-database/ " > < / >来源
顾名思义。如果几个人想游泳,他们可以在同一个游泳池游泳,每次有人加入就建造一个新的游泳池真的有意义吗?时间和成本是优先考虑的。
数据库连接池只是缓存到数据库的连接,以便下次可以重用它们,以减少每次我们想要连接到数据库时建立新连接的成本。