如何解决nodejs pg-pool 似乎没有池化
我一直试图让 nodejs 在我的应用程序中汇集 postgresql 连接,但没有成功。这是我所做的独立测试:
const config = require('../config/project_config.json');
const Pool = require('pg-pool');
var pool = new Pool({
user: config.DB_USER,host: config.DB_HOST,database: config.DB_DB,password: config.DB_PW,port: 5432,max: 500,min: 200,idleTimeoutMillis: 0,connectionTimeoutMillis: 10000
});
for (var i=0; i<100; i++){
pool.query(
"SELECT id,email FROM players WHERE email ~ 'ltUser'",[],(err,res) => {
if (err !== null && err != undefined){
console.log(`err: ${err}`);
}
else{
console.log(`num rows: ${res.rows.length}`);
}
});
}
我得到的结果是:
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
err: Error: Connection terminated due to connection timeout
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
num rows: 400
如您所见,它抛出连接超时,这意味着在我创建池时它没有创建连接。在创建池时,我尝试了各种参数组合,包括使用 keepalive: true
,但似乎没有一个使 pg-pool 实际上池连接。我也试过 pg 而不是 pg-pool。但得到了完全相同的结果,尽管我后来发现它们基本上是相同的代码。
如果我用更长的查询运行它,我可以在 psql 中连接到数据库并运行
SELECT datname,usename,ssl,client_addr,count(*
FROM pg_stat_ssl
JOIN pg_stat_activity
ON pg_stat_ssl.pid = pg_stat_activity.pid
where usename != 'azure_superuser'
group by datname,client_addr;
并观察我的 IP 地址的连接数上升然后再次下降。
是我做错了什么还是 pg-pool 坏了?
我在 ubuntu xenial 服务器上使用 nodejs v10.22.1。
解决方法
事实证明 pg-pool 可以正常工作,只是根据我在其他编程语言(如 Java 和 Erlang)方面的经验,不是我所期望的方式。 Nodejs 不会提前创建连接,而是在连接从池中检出时创建。
基于此,Nodejs 中池化的主要优点是程序员不必处理打开和关闭连接,并且可以重复使用这些连接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。