什么是数据库池?

sag*_*r27 108 java database database-connection connection-pooling

我只是想知道数据库连接池的概念及其实现方式.

pax*_*blo 175

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

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

以下几段请参考下图:

  +---------+
  |         |
  | Clients |
+---------+ |
|         |-+  (1)   +------+   (3)    +----------+
| Clients | ===#===> | Open | =======> | RealOpen |
|         |    |     +------+          +----------+
+---------+    |         ^
               |         | (2)
               |     /------\
               |     | Pool |
               |     \------/
           (4) |         ^
               |         | (5)
               |     +-------+   (6)   +-----------+
               #===> | Close | ======> | RealClose |
                     +-------+         +-----------+
Run Code Online (Sandbox Code Playgroud)

在它最简单的形式中,它只是一个类似于开放连接API调用的API调用(1),类似于"真实"调用.这首先检查池是否有合适的连接(2),如果可用,则检查给客户端.否则创建一个新的(3).

类似地,有一个关闭的API调用(4)实际上并不调用真正的关闭连接,而是将连接放入池(5)供以后使用.在某些时候,池中的连接可能实际上是关闭的(6).

这是一个非常简单的解释.真正的实现可能能够处理到多个服务器和多个用户帐户的连接,它们可以预先分配一些连接基线,以便一些立即就绪,并且当使用模式静默时它们实际上可以关闭旧连接.

  • 我是从零开始做的(傻我).如果你想看到一些不错的图形,请看一下zengr的答案. (15认同)
  • 你从哪里得到漂亮的小图? (8认同)
  • 如果一个可用,则将其提供给客户端,否则将创建一个新的。类似地,有一个关闭 API 调用,它实际上并没有调用真正的关闭连接,而是将连接放入池中供以后使用。正如你提到的,我没有什么问题。当1000个客户端请求连接并没有关闭。所以池中有 1000 个连接是活动的。这对池性能有好处吗??让我知道我的理解有点错误?? (2认同)
  • @DiegoMariani,比我手动完成要慢,比我试图强迫 MS Word 让它更容易的要快:-) (2认同)

zen*_*ngr 84

图像说千言万语(paxdiablo给出了一个很棒的描述):

替代文字

资源

  • 显然,_good_图像也讲几百个ASCII艺术:-) (32认同)
  • 我在 Pool 中看到 4 个连接。所以这个池中的连接数是通过池类型限制的?或者当 Pool 中的连接不是空闲时会发生什么?客户端需要等待连接空闲?? (2认同)
  • @DEADEND这实际上取决于连接池的实现方式。当连接达到最大容量时,大多数池都会创建一个新连接。这可以继续增长,直到数据库达到阈值。在某些情况下(例如oracle jdbc),您可以在池构建过程中指定“初始大小”和“最大大小”。 (2认同)
  • 不幸的是,图像并没有说明最重要的事情。那就是:__为什么保持10、20、30,...个打开的连接数比在需要时打开一个连接要便宜得多的内存和整体系统性能?__怎么可能?30比1便宜吗?怎么样? (2认同)

vde*_*nne 10

顾名思义。如果有几个人想游泳,他们可以在同一个游泳池里游泳,那么每次有人增加一个新的游泳池真的有意义吗?时间和成本是重中之重。


小智 6

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