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

时间:2017-05-20 02:58:47

标签: database connection-pooling

来自here

的回答
  

通常,打开数据库连接是一项昂贵的操作,因此   pooling保持连接处于活动状态,以便在连接时   后来要求,其中一个活跃的用户优先使用   打开另一个。

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

我无法理解为什么如何有可能保持池中30个打开的连接对于系统而言比打开成本更低需要时建立新连接。

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

1 个答案:

答案 0 :(得分:6)

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

来自here

  

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

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

来自here

  

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

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