PG 在高并发请求上承诺太多客户端

PG Promise too many client on high concurrent request

我正在尝试根据其他 table 的选定数据插入百/千数据,但我发现错误“客户端太多”,这是错误

我正在使用 pgp (pg promise) 库,这是我的代码片段

function call(){
   for (let index = 0; index < 5; index++) {
        getPendingData().then((result) => {
            db.tx((t) => {
                let counter = 0;
                const queries = result.map((data) => {
                    counter++;
                    return db.none(`insert into test_data (id, isdeleted, parentid) values ('${uuidv1()}', 0, '${uuidv1()}x-${uuidv1()}' ) `);
                });
                return t.batch(queries);
            });
        });
   }
}


let  getPendingData = async () => {
     return db.task('getPendingData', async (t) => {
         return await t.any('select * from other_table');
     });
}


(call())

im 设置最大 pg conn 为 100, 任何线索如何在不添加 max conn 的情况下解决这个问题?

你的代码问题太多,很遗憾...

您使用 promise 的方式和使用方式都不正确 pg-promise

promise 的问题是你应该将它们链接起来,这意味着使用 db.tx (return db.tx(...)) 的结果,你没有这样做,创建一个松散的 promise ,因此,与事务相关联的连接松散。此外,return await 是一种反模式。

使用 pg-promise 的问题是您应该针对正在创建的 transaction/task 上下文 t (as shown here) 执行查询。但是您正在针对 db - root 连接执行每个查询,这会产生无数连接请求。

另外,创建一个只执行一个查询的任务没有任何意义。

如果这还不够糟糕,您正在对值进行字符串连接,这在查询格式中是严格禁止的。

最后,多个插入应该作为多行查询执行,而不是作为单独的查询执行,这会浪费性能 - 请参阅