为什么许多打开的连接的连接池对于系统来说比每次打开新连接的成本更低?

Gre*_*een 4 database connection-pooling

答案来自这里

通常,打开数据库连接是一项昂贵的操作,因此池保持连接处于活动状态,以便在稍后请求连接时,使用其中一个活动连接而不是打开另一个连接.

我理解Connection PoolDB管理的概念.这就是" 什么是〜 "问题的答案.所有开发人员的博客文章,答案,教程,数据库文档总是回答" 什么是 " 的问题.就像他们不断地从彼此复制/粘贴文本一样.没有人试图解释" 为什么会如此 "和" 如何 ".上面的答案就是一个例子.

我无法理解为什么以及如何保持池中30个打开的连接对于系统而言比在需要时打开新连接成本更低.

假设我在澳大利亚有一个Web服务器.AWS中的数据库位于美国俄勒冈州的某个地方.或者以GB.或者在远离AUS的任何地方.所以他们都说保持一个20 -...打开的连接池对于内存和系统性能来说比在这种情况下每次打开一个新连接要便宜?它怎么样?为什么?

Mar*_*ari 6

在您的方案中,我认为最大的问题是网络延迟.您不能指望位于两个不同大洲的服务器之间的通信速度特别快.因此,如果您每次需要时都启动新连接,则每次都会遇到此延迟.

这里:

连接到数据库服务器通常包含几个耗时的步骤.必须建立物理通道,如套接字或命名管道,必须进行与服务器的初始握手,必须解析连接字符串信息,连接必须由服务器进行身份验证,必须运行检查以获取当前交易,等等.

此外,如果Web服务器和数据库之间的连接使用SSL/TLS,则在实际通信发生之前必须对每个新连接执行握手(除了正常连接中发生的正常握手之外).这种握手在时间上是昂贵的.

这里:

在客户端和服务器可以开始通过TLS交换应用程序数据之前,必须协商加密隧道:客户端和服务器必须就TLS协议的版本达成一致,选择密码套件,并在必要时验证证书.不幸的是,这些步骤中的每一步都需要在客户端和服务器之间进行新的数据包往返,这会增加所有TLS连接的启动延迟.(...)正如上面的交换所示,新的TLS连接需要两次往返才能进行"完全握手" - 这是坏消息

当您使用连接池时,通过定期向SQL服务器发送类似"ping"消息的内容来避免此开销,以避免由于不活动而导致超时连接.当然,这可能会在您的服务器中消耗更多内存,但现在这是一个便宜得多的资源.网络的延迟是不可避免的.