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 连接执行每个查询,这会产生无数连接请求。
另外,创建一个只执行一个查询的任务没有任何意义。
如果这还不够糟糕,您正在对值进行字符串连接,这在查询格式中是严格禁止的。
最后,多个插入应该作为多行查询执行,而不是作为单独的查询执行,这会浪费性能 - 请参阅 。
我正在尝试根据其他 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 连接执行每个查询,这会产生无数连接请求。
另外,创建一个只执行一个查询的任务没有任何意义。
如果这还不够糟糕,您正在对值进行字符串连接,这在查询格式中是严格禁止的。
最后,多个插入应该作为多行查询执行,而不是作为单独的查询执行,这会浪费性能 - 请参阅