我需要在我的应用程序实例上线时,将咨询锁挂在30秒左右。我注意到,如果我做一个 setTimeout
的回调来释放锁,如果时间超过30秒,我就会收到一个警告,说我没有一个类型为ExclusiveLock的锁。(如果我用10秒调用setTimeout,这种情况就不会发生)
setTimeout(async () => {
try {
await sync.tryLockRelease(lockName) // call to pg_advisory_unlock(id);
log.info(`${metadataKey}: lock released`)
} catch (err) {
log.error(`${metadataKey}: could not release lock: ${err.message}`, err)
}
}, 30000)
如果我添加一个每秒钟查询DB的间隔,这个问题就不会发生。这使我相信会话在大于10秒的某个时间被取消。
原来在pg-promise(会被传递给底层的node-postgres库)中有一个设置,叫做 idleTimeoutMillis
,它可以设置在 连接语法 pg-promise的页面。然而,似乎仍有一个悬而未决的问题,即底层驱动没有尊重该值。https:/github.combriancnode-postgresissues2139。