【问题标题】:pg-promise task double connection?pg-promise 任务双连接?
【发布时间】:2019-01-19 05:38:49
【问题描述】:

根据Chaining-Queries pg-promise wiki Task 是在单个共享连接中进行多个查询的首选方式。

虽然我知道将 Task 用于单个查询是没有意义的,但我使用单个查询进行测试只是为了查看它在日志中的显示方式。获得的结果不知何故让我感到惊讶

没有任务:

07:14:02 connect(user@db); useCount: 0
07:14:02 SELECT * FROM t
07:14:02 disconnect(user@db)

有任务:

07:15:27 connect(user@db); useCount: 0
07:15:27 task/start
07:15:27 connect(user@db); useCount: 0
07:15:27 SELECT * FROM t
07:15:27 disconnect(user@db)
07:15:27 task/end; duration: .009, success: true
07:15:27 disconnect(user@db)

useCount: 0 表示新的物理分配连接

连续进行多个此类查询会重复该模式。每个任务包装查询显示 2 个分配的连接。一个用于主(?)线程,第二个用于任务本身。

useCount 正确增加,这意味着从池中重用连接。但主要的事情仍然存在 - 每个任务处理从连接池中分配 2 个连接。

这是预期的行为还是我错过了什么?

【问题讨论】:

  • 您需要显示创建此日志的代码。看起来您在任务内部强制创建新连接,很可能是因为您没有使用任务提供的连接上下文。
  • @vitaly-t 你是对的。在简单的情况下,所有工作都在单个连接中在我的情况下,回调方法被粘贴为参数。在其中还有另一个包装器,它动态选择相应的实体存储库(又名 pg-promise-demo)。在这种模式下,ctx 丢失了,子查询正在从池中分配新的连接

标签: node.js pg-promise


【解决方案1】:

由于尺寸问题,我无法将其发布为对@vitaly-t 评论的回复。

为了让子查询重用父会话上下文,请确保调用任务方法中提供的上下文对象t

return this.db.task(t => {
  return t.any('select now()').then(
    () => t.any('select now()').then(
      () => '2 queries are executed'
    )
  )
})

我们得到

13:30:26 connect(user@db); useCount: 0
13:30:26 task/start
13:30:26 task: select now()
13:30:26 task: select now()
13:30:26 task/end; duration: .005, success: true
13:30:26 disconnect(user@db)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 2017-09-01
  • 2017-04-19
  • 2016-10-31
  • 1970-01-01
  • 2018-02-24
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多