什么是数据库池?

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

95861 次浏览

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

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

以下几段请参考下图:

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

在最简单的形式中,它只是一个API调用(1)到Open API调用,类似于"real"1、RealOpen。它首先检查池中是否有合适的连接(2),如果有,就把连接给客户端。否则,将创建一个新的(3)并给客户端。

“合适的连接”;只是一个已经访问数据库使用正确的信息(如数据库实例,凭据,和可能的其他东西)。

类似地,有一个Close API调用(4),它实际上并不调用真正的 RealClose,而是将连接放回池(5)以供以后使用。在某些时候,池中的连接可能被实际上关闭(6)。这可以通过一个线程来完成,该线程持续监视池并在它们足够老或满足某些其他条件时调用RealClose

这是一个相当简单的解释。真正的实现可能更加复杂,例如前面提到的:

  • 处理连接到多个服务器和使用多个用户帐户;
  • 使用任意规则来决定何时应该真正关闭连接,比如它的年龄,有多少个类似的连接,等等。

数据库连接池是一种更普遍的情况,即维护缓存的内容,而这些内容的启动成本可能很高。正如你从我也有类似的回答中看到的,它也可以应用于线程池(或备份磁带、通信设备、激光切割机或其他几十种不同东西的池)。

在任何情况下,最好是“昂贵”;使另一种资源联机,而不是使用以前联机的资源。

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

图片胜过千言万语(paxdiablo给出了一个很棒的描述):

alt text

< a href = " http://ejbvn.wordpress.com/category/week-2-entity-beans-and-message-driven-beans/day-09-using-jdbc-to-connect-to-a-database/ " > < / >来源

连接池的概念不仅在Java中,而且在许多编程语言中。创建一个新的连接对象成本很高,因此在创建虚拟池的生命周期中建立和维护固定数量的连接 Java Just (http://javajust.com/javaques.html)参见本页问题14

顾名思义。如果几个人想游泳,他们可以在同一个游泳池游泳,每次有人加入就建造一个新的游泳池真的有意义吗?时间和成本是优先考虑的。

数据库连接池只是缓存到数据库的连接,以便下次可以重用它们,以减少每次我们想要连接到数据库时建立新连接的成本。