【问题标题】:What is database pooling?什么是数据库池?
【发布时间】:2011-05-01 18:21:29
【问题描述】:

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

【问题讨论】:

    标签: database database-connection connection-pooling


    【解决方案1】:

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

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

    接下来的几段请参考下图:

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

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

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

    同样,有一个关闭 API 调用 (4),它实际上并不调用 real 关闭连接,而是将连接放入池 (5) 以供以后使用。在某些时候,池中的连接可能实际上关闭 (6)。

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

    【讨论】:

    • 漂亮的小图表从哪里来的?
    • 我是从头开始制作的(我很傻)。如果您想看到一些像样的图形,请查看 zenr 的答案。
    • 如果一个可用,则提供给客户端,否则创建一个新的。类似地,有一个关闭 API 调用,它实际上并没有调用真正的关闭连接,而是建立连接放入池中以备后用。正如你提到的,我没什么问题。当 1000 个客户端请求连接且未关闭时。所以 1000 连接在池中是活动的。这对池性能有好处??让我知道我的理解有点不对??
    • @YeWin,不,这听起来不错。关于池中剩余 1000 个连接的问题,这可能会发生,但通常只有当您最终在某个时候有 1000 个并发活动连接时才会发生。否则,会被重复使用并且不会达到 1000。关于这种情况,请参阅我的倒数第二段,特别是“当使用模式安静下来时可能实际上关闭旧连接”位。
    • @DiegoMariani,比我手动完成要慢,比我试图强迫 MS Word 使它更容易:-)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 游泳池有人数限制吗?比如连接到数据库的连接数?数据库什么时候开始新的连接?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        图片说出一千个单词(paxdiablo 给出了很棒的描述):

        Source

        【讨论】:

        • 显然,good 图像也能表达数百个 ASCII 艺术 :-)
        • @sagar 请选择您认为最有用的答案。您没有接受记录。
        • 我在 Pool 中看到了 4 个连接。所以这个池中的连接数受到池类型的限制?或者当 Pool 中的连接不空闲时会发生什么?客户端需要等待连接空闲吗??
        • @DEADEND 这真的取决于连接池是如何实现的。当连接达到最大容量时,大多数池都会创建一个新连接。这可以继续增长,直到 db 达到阈值。在某些情况下(如 oracle jdbc),您可以在池构建过程中指定“初始大小”和“最大大小”。
        • 不幸的是,图片并没有说明最重要的事情。即:为什么保持打开 10、20、30……数量的连接比在需要时打开一个连接对内存和整体系统性能的成本更低? 怎么可能? 30 比 1 成本更低?怎么样?
        猜你喜欢
        • 2011-05-13
        • 2020-05-30
        • 1970-01-01
        • 2010-09-11
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 2021-06-09
        相关资源
        最近更新 更多