database - Node 应该在什么时候创建数据库连接?

标签 database node.js postgresql database-connection

我有一个通过 node-postgres 使用 PostgreSQL 的 Node.js 应用程序。我开始收到错误消息“抱歉,已经有太多客户端”,这让我想知道我是否创建了太多客户端对象,或者我是否应该手动断开它们。目前,我正在为每个访问数据库的函数调用创建一个新的客户端对象。例如:

var db {
  checkDetails : function() {
    var client = new pg.Client(conString);
    ...
  },

  amendDetails : function() {
    var client = new pg.Client(conString);
    ...
  },
...
}

这是正确的还是我应该在别处创建一个客户端对象?还是我应该调用 client.end()?由于我使用的回调样式的示例不包含此内容,因此我认为这是不必要的。

最佳答案

这里有相当多的有效选择,包括继续您当前的方法,添加类似 PgBouncer 的东西来使用单例。这些有不同的考虑因素,因此选择哪个更好可能取决于您的具体情况。不过,我会在这里提到这两个选项之间的权衡。

首先是一些基础知识

与所有其他 RDBMS 一样,PostgreSQL 必须协调不同进程之间的数据访问。一般来说,数据访问端的并行度越高,等待锁的次数就越多。因此,一个关键是管理并行性。

一方面,PostgreSQL 上的单个连接永远不会超出数据库服务器的单个核心和单个硬盘驱动器轴。事实上,它永远不会扩展到这个程度。另一方面,除非您有 50 个内核和非常快的硬盘驱动器,否则 100 个连接最终将花费大部分时间等待其他进程,因此您需要在开始之前了解这种权衡。

选项 1:单例

单例数据库连接是最简单的方法。请注意,PostgreSQL 连接一次只能运行一个查询,因此您实质上将通过单个接口(interface)序列化所有数据库访问。这不适用于事务,它对您对数据库管理器的期望设置了严格限制,但是在低端服务器上,您将获得比允许 100 个并发连接时更好的性能。

选项 2:连接池,可能使用 PGBouncer

第二种可能性是您可以连接到连接池而不是数据库,并让连接池管理连接。这是最灵活的方法,因为它为您提供了一个工具包来处理诸如事务之类的问题(如果需要),并且与单例相比,它可以更好地控制并行性。使用连接池,您可以指定要使用的连接数、是否池化事务等。一般来说,如果您正在寻找可扩展性,这可能是开始的地方。

主要缺点是这让您需要管理更多的软件,因此会增加一些复杂性成本。但是,它还为您提供了一个围绕数据库连接的抽象层,您可以使用它来管理性能。

关于database - Node 应该在什么时候创建数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16318273/

相关文章:

mysql - 如何使主键从001开始?

mysql - 单个查询中的多个 MySQL 计数

java - java中数据库中的洗牌

sql - 数据库审计追踪并重建以前的结果

node.js - MongoDB 更新/插入文档并递增匹配的数组元素

javascript - StatsD 启动错误

sql - Postgres : Why did adding index slow down regexp queries?

node.js - 如何对 Mongoose 模型进行单元测试?

sql - 如何使用 SQL 查找用户 session 事件之间的时间

ruby-on-rails - 如何将表列转换为另一种数据类型