【问题标题】:At what point should Node be creating the database connection?Node 应该在什么时候创建数据库连接?
【发布时间】:2013-04-25 11:00:00
【问题描述】:

我有一个通过 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()?由于我使用的回调样式的示例没有包含这个,我认为它是不必要的。

【问题讨论】:

  • 您应该使用Singleton 数据库连接,这意味着您的代码中应该只有一个客户端来处理所有查询。而且您不必使用end()
  • 另外,你应该监听数据库close事件,如果连接失败,重新连接
  • 我注意到客户端connect 是异步的,所以使用EventEmitter。我不熟悉node-postgres,但这就是我在cassandra中的做法(gist.github.com/wwwy3y3/5412976

标签: database node.js postgresql database-connection


【解决方案1】:

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

首先是一些基础知识

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

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

选项 1:单例

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 2013-12-11
    • 2011-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多