Node.js pg承诺任务双重连接?
根据pg promise,wiki任务是在单个共享连接中进行多个查询的首选方式 虽然我理解在单个查询中使用Task是没有意义的,但我在测试中使用single query只是为了查看它在日志中的表现。获得的结果让我感到奇怪 无任务:Node.js pg承诺任务双重连接?,node.js,pg-promise,Node.js,Pg Promise,根据pg promise,wiki任务是在单个共享连接中进行多个查询的首选方式 虽然我理解在单个查询中使用Task是没有意义的,但我在测试中使用single query只是为了查看它在日志中的表现。获得的结果让我感到奇怪 无任务: 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:
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个连接
这是预期的行为还是我错过了smth?由于大小原因,我无法将此作为对@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)
您需要显示创建此日志的代码。看起来您在任务内部强制创建新连接,很可能是因为您没有使用任务提供的连接上下文。@vitaly-t您是对的。在直截了当的情况下,在我的案例中,所有工作都在单个连接中,回调方法被粘贴为一个参数。其中还有另一个包装器,它动态地选择相应的实体存储库(aka pg promise demo)。在这种模式下,ctx丢失,子查询从池中分配新的连接,这就是一直告诉您要做的;)