【问题标题】:PostgreSQL: use same connection or get another from pool?PostgreSQL:使用相同的连接还是从池中获取另一个?
【发布时间】:2017-12-20 23:47:59
【问题描述】:

我有一个Node.js 脚本和一个PostgreSQL 数据库,我将使用一个库来维护与数据库的连接池。

假设我有一个脚本在脚本的不同部分多次查询数据库(不是 事务),我如何判断我是否应该获取单个连接/客户端并在整个过程中重用它*,还是从池中为每个查询获取一个新客户端? (两者都有效,但哪个性能更好?)

*taskpg-promise 库中,connectnode-postgres 库中。


...
// Acquire connection from pool.
(Database query)
(Non-database-related code)
(Database query)
// Release connection to pool.
...

...
// Acquire connection from pool.
(Database query)
// Release connection to pool.
(Non-database-related code)
// Acquire connection from pool.
(Database query)
// Release connection to pool.
...

【问题讨论】:

  • 你读过这个吗? - Chaining Queries.
  • @vitaly-t 为什么第二种方法会“耗尽池子”?每次查询后客户端不会重新释放吗?
  • 高并发导致的耗尽,即尝试并行执行的查询多于池中可用连接的总数。新的将被卡住,等待池中的连接可用。这就是为什么在繁忙的系统中使用任务很重要的原因。
  • @vitaly-t 我不明白。无论使用哪种方法,脚本的每个实例一次最多只能执行一个查询。没有?
  • 在 HTTP 服务中,查询是并发执行的,HTTP 处理程序也是如此,因此可以有任意数量的并发查询。

标签: node.js postgresql node-postgres pg-promise


【解决方案1】:

我不确定您使用的池是如何工作的,但通常它们应该重用连接(使用后不要断开连接),因此您不需要关心缓存连接。

【讨论】:

    【解决方案2】:

    您可以使用 node-postgres 模块,这将使您更轻松地完成任务。 关于您何时使用 pool 的问题,这里是简短的回答。

    PostgreSQL 服务器每个连接一次只能处理 1 个查询。 这意味着如果您有 1 个全局 new pg.Client() 连接到您的 根据 postgres 的速度,您的整个应用程序的后端都会遇到瓶颈 可以回复查询。它实际上会把所有东西都排好,排队 每个查询。是的,它是异步的,所以没关系......但你不会 而是将您的吞吐量乘以 10 倍?使用 pg.connect 设置 pg.defaults.poolSize 到一些理智的东西(我们做 25-100,不确定 正确的数字)。

    新的 pg.Client 适用于您知道自己在做什么的时候。当你需要一个 由于某种原因或需要非常小心的单身长期客户 控制生命周期。一个很好的例子是使用 收听/通知。监听客户端需要在附近并连接 并且不共享,因此它可以正确处理 NOTIFY 消息。其他 例如,当打开一个 1-off 客户端来杀死一些挂起的 东西或在命令行脚本中。

    这是该模块的链接。 希望这会有所帮助。 https://github.com/brianc/node-postgres

    您可以在那里查看有关池的文档。谢谢:)

    关于关闭池,它提供了回调 done ,当您想要关闭该池时可以调用该回调。

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 2011-11-17
      • 2018-07-19
      • 1970-01-01
      • 2013-10-12
      • 2018-11-25
      • 2022-01-13
      • 1970-01-01
      • 2018-03-05
      相关资源
      最近更新 更多