池化、客户端签出、idleTimeoutMillis

Pooling, Client Checked out, idleTimeoutMillis

这是我看完Documents的理解:

  1. 池化,与许多其他数据库一样,我们只有一定数量的允许连接,所以你们都排队等待池中的空闲连接return。 (连接在某种意义上就像令牌)
  2. 在任何给定时间,活动的 and/or 可用连接数控制在 0-max.
  3. 范围内
  4. idleTimeoutMillis 表示“客户端在与后端断开连接并被丢弃之前必须在池中闲置且未被检出的毫秒数。”不清楚这一点。通常认为,当客户端说 Web 应用程序已完成其 CRUD 但未完成 return 时,自愿认为连接是 idlenode-postgres 将启动时钟,一旦达到毫秒数,将为下一个客户端将连接带回池中。那么什么是在与后端断开连接并丢弃之前未被检出?

idleTimeoutMillis: 100,这是否意味着此连接将在空闲 100 毫秒后真正断开(注销)?如果是,那么它不会 returning 到池中,并且会导致频繁的登录连接,如下文所述:

Connecting a new client to the PostgreSQL server requires a handshake which can take 20-30 milliseconds. During this time passwords are negotiated, SSL may be established, and configuration information is shared with the client & server. Incurring this cost every time we want to execute a query would substantially slow down our application.

提前感谢愚蠢的问题。

抱歉,这个问题这么久都没有得到解答,但我最近遇到了一个错误,它也质疑了我对这个库的理解。

基本上,当您进行池化时,您是在对图书馆说,您最多可以同时打开 X 个数据库连接。因此,例如,进入 CRUD API 的每个请求都会打开一个新连接,并且您将总共有 X 个请求,因为每个请求都会打开一个新连接。现在这意味着一旦有请求进入它 'checks out' 来自池的连接。这也意味着另一个请求无法使用此连接,因为它当前被另一个请求阻止。

因此,为了让我们说 'reuse' 同一个连接,当一个请求完成时,您必须释放它并说它可以再次使用 'checking out'。现在,当另一个请求进入时,它可以使用此连接并执行上述查询。

idleTimeoutMillis 这个变量让我很困惑,我花了一段时间才弄清楚。当与已释放的 DB 建立连接或 'checked out' 时,它处于 IDLE 状态,这意味着任何想要发出请求的人都可以使用此连接发出请求,因为它未被使用。这个变量表示当一个连接处于空闲状态时,我们要等多久才能关闭这个连接。对于各种事情,这可能会被使用。显然,打开数据库连接需要内存等,因此关闭它们可能是有益的。此外,在自动缩放时 - 假设您处于最大值 requests/second 并且您正在使用所有 DB conns,那么这对于保持 IDLE 连接打开一段时间很有用。但是,如果这太长并且您缩小规模,那么您可以 运行 进入延长的内存,因为每个 IDLE 连接都需要一些内存 space.

这样做的好处是,当您有一个打开的连接并仅使用它发送一个查询时,您不需要使用它已经过身份验证并准备就绪的数据库重新进行身份验证。