Node.js PostgreSQL

Posted

技术标签:

【中文标题】Node.js PostgreSQL【英文标题】: 【发布时间】:2017-12-04 12:51:30 【问题描述】:

我看到包作者 (What is the proper way to use the node.js postgresql module?) 对 *** 帖子的评论说最好的方法是每次都使用 pg.connect。我想知道这种方法是否与他在 npm 网站 (https://www.npmjs.com/package/pg) 上提到的示例不同?

在我看来,如果我关注你在 *** 上的帖子,那么如果在高峰期有 1000 个不同的客户端访问数据库,那么将创建 1000 个不同的数据库客户端连接,并且可能存在数据库崩溃的风险(缺乏内存)。此外,此方法(每次仅使用 pg.connect)是否有一个连接池,其中连接被重用,并且只有 pg.defaults.poolSize 设置的最大连接数。如果我错了,请纠正我?

【问题讨论】:

pg.connect 现已过时,在当前版本中将显示弃用警告。为避免连接位置和连接方式的所有问题,请改用pg-promise ;) 【参考方案1】:

为每个查询建立一个新连接将为每个查询产生不必要的开销。

使用node.js postgres模块的正确方法是有一个连接池,每次要查询时从池中获取一个连接。

原因不是因为缺少内存导致数据库崩溃。 postgres 数据库可以打开的最大连接数。该数量将在 postgresql.conf 中设置,并且通常比使 ram 崩溃的数量要低得多(除非您故意将其设置为荒谬的)。

保持连接池有一些好处:

    它减少了响应时间,因为您无需花费不必要的时间打开(和关闭)数据库连接。 您始终知道在给定时间打开了多少连接。即使在您告诉连接关闭之后,您也不会在关闭之前让连接空闲等待 30 秒或类似的时间。 与为每个查询打开一个新连接相比,当您使用连接池时,您的应用程序中出现不可预测状态的可能性会大大降低。

另外,我倾向于将最大连接数的 80% 分配给应用程序。 20% 留给需要为自己的工作查询数据库的复制工作和数据团队。分配 100% 也可能导致您的应用程序出现不可预测的状态。

【讨论】:

使用***帖子中的方法(每次pg.connect())打开一个新连接直到它达到pg.defaults.poolSize然后重新使用这些连接或者我应该使用npm 网站中的方法? node-postgres 模块中应该有一个 pg.pool 或等效的。你可以用那个。这就是我们在生产中使用的。我们的产品规模不大,但池对我们来说仍然是零问题。【参考方案2】:

原则上 - 是的。但请记住,驱动程序不能同时执行多个查询。这就是为什么建议使用多个连接的原因——但这可能会因为其他原因而降低性能,例如太多的套接字、Postgres 的最大打开连接数等。此外,您可能面临的一些问题可能不是那么明显,但很有可能根据您的用例 - 查看一些相关问题:

pg.defaults.poolSize makes no difference. #931 Suitable values for poolSize, poolIdleTimeout and reapIntervalMillis #1222 pg.defaults.poolSize vs pg-pool #1102 PG.connect never calls-back after (PG.defaults.poolSize) connections are used [6.0.3] #1085

您可能想查看的一些模块:

pooled-pg - “与 pg 兼容的 PostgreSQL 驱动程序,具有更有效的池化策略。” ppooled-pg - “承诺的 PostgreSQL 驱动程序具有更有效的池化策略。”

【讨论】:

以上是关于Node.js PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

[Node.js]如何在IDEA中配置Node.js

node.js 初识node.js,运行在服务端的 JavaScript

node.js教程基础:node.js命令行选项

Node.js HTTP模块

Node.js基础:第一篇

270 Node.js快速入门:Node.js 的组成,Node.js基础语法,Node.js全局对象global