0

在我的express-js应用程序pg-promise中,有时会停止接受连接,即使是简单的select now()查询也是如此。这是非常随机的。我可以运行负载测试并让 100 个并发请求运行 10 秒,响应时间为 100+ req/s。然后突然它停止工作并且单个 curl 请求将无法工作,即使它除了进行select now()查询之外什么都不做。

发生这种情况时,有时它会通过重新启动节点应用程序来工作。有时即使这样也无济于事。

对于不访问数据库的路由,我始终可以访问 express 应用程序,因此我相当确定这与数据库连接有关。

pgp 的连接选项如下所示(已删除详细信息):

{
    host: '111.111.111.111',
    port: 5432,
    database: 'database-name',
    user: 'database-user',
    password: 'super secret password'
}

我测试数据库的简单快速路线如下所示:

app.get(apiPrefix + '/fail', async (req: express.Request, res: express.Response, next: NextFunction) => {
    await db.task(uuid(), async (tx) => {
        const time = await tx.one('select now() as time');

        res.json({status: 'OK', time: time.time});
    });
});

我还有一个处理错误并记录它们的中间件,但发生这种情况时没有记录任何内容。有时任务事件pgpFunc.IInitOptions会触发,但永远不会将“ finish”属性设置为 true。该error事件永远不会触发。

感觉好像有什么东西阻塞了连接池,但我不知道是什么以及为什么。

pg-monitor 失败时的示例输出:

14:26:43 connect(***@***); useCount: 0
14:26:43 task(Auth: acb606e2-a79f-42a4-afe7-f94c8e35d2e8)/start
14:26:43 connect(***@***); useCount: 0
14:26:43 task(Auth: eb28be63-dfda-43a2-9884-05415aa54fbe)/start
14:26:43 connect(***@***); useCount: 0
14:26:43 task(Auth: 59ec38c4-be8f-498b-a77b-3a96ecddf41d)/start
14:26:43 connect(***@***); useCount: 0
14:26:43 task(Auth: f024626a-5e59-4675-a3f2-825ed78dd35d)/start
14:26:43 connect(***@***); useCount: 0
14:26:43 task(Auth: df456fad-ed80-4110-995f-0260db4ec118)/start
14:26:43 connect(***@***); useCount: 0
4

0 回答 0