gpt4 book ai didi

javascript - 使用 node.js postgresql 模块的正确方法是什么?

转载 作者:IT老高 更新时间:2023-10-28 21:48:20 25 4
gpt4 key购买 nike

我正在 Heroku 上编写一个 node.js 应用程序并使用 pg module .对于查询数据库所需的每个请求,我无法找出获取客户端对象的“正确”方式。

文档使用如下代码:

pg.connect(conString, function(err, client) {
// Use the client to do things here
});

但您肯定不需要在每个使用数据库的函数中调用 pg.connect 对吧?我看过other code这样做:

var conString = process.env.DATABASE_URL || "tcp://postgres:1234@localhost/postgres";
var client = new pg.Client(conString);
client.connect();
// client is a global so you can use it anywhere now

我倾向于第二种选择,因为我相信 Heroku 的免费数据库实例无论如何都仅限于一个连接,但是这样做有什么缺点吗?我是否需要在每次使用之前检查我的客户端对象是否仍然处于连接状态?

最佳答案

我是 node-postgres 的作者.首先,我很抱歉文档未能明确说明正确的选择:这是我的错。我会努力改进它。我写了a Gist刚才解释一下因为the conversation对 Twitter 来说太长了。

Using pg.connect is the way to go in a web environment.

PostgreSQL server can only handle 1 query at a time per connection. That means if you have 1 global new pg.Client() connected to your backend your entire app is bottleknecked based on how fast postgres can respond to queries. It literally will line everything up, queuing each query. Yeah, it's async and so that's alright...but wouldn't you rather multiply your throughput by 10x? Use pg.connect set the pg.defaults.poolSize to something sane (we do 25-100, not sure the right number yet).

new pg.Client is for when you know what you're doing. When you need a single long lived client for some reason or need to very carefully control the life-cycle. A good example of this is when using LISTEN/NOTIFY. The listening client needs to be around and connected and not shared so it can properly handle NOTIFY messages. Other example would be when opening up a 1-off client to kill some hung stuff or in command line scripts.

一件非常有用的事情是将应用程序中对数据库的所有访问集中到一个文件中。不要在整个过程中乱扔 pg.connect 调用或新客户端。有一个像 db.js 这样的文件,看起来像这样:

module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}

通过这种方式,您可以将您的实现从 pg.connect 更改为自定义客户端池或其他任何内容,并且只需在一个地方进行更改。

看看node-pg-query module就是这样做的。

关于javascript - 使用 node.js postgresql 模块的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8484404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com