2013-05-01 96 views
1

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

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

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

这是正确的还是应该在其他地方创建一个客户端对象?或者我应该打电话给client.end()?作为我使用的回调风格的例子没有包括这个,我认为这是没有必要的。

+0

你应该使用'Singleton'数据库连接,这意味着你的代码中只有一个客户端可以处理所有的查询。并且你不必使用'end()' – williamC 2013-05-01 12:49:27

+0

也应该监听数据库'close'事件,如果连接失败,只需重新连接 – williamC 2013-05-01 12:50:30

+0

我注意到客户端'connect'是异步的,所以使用'EventEmitter '。我不熟悉'node-postgres',但这是我在cassandra中做到的(https://gist.github.com/wwwy3y3/5412976) – williamC 2013-05-01 13:15:04

回答

0

这里有相当多的有效选择,包括继续使用当前的方法,添加诸如PgBouncer之类的东西来使用单例。这些有不同的考虑因素,所以选择哪一个更好取决于你的具体情况。不过,我会在这里提及这两种选择之间的权衡。

首先是一些基础知识

PostgreSQL的,像所有其他的RDBMS必须协调访问各工序间的数据。一般而言,数据访问方面的并行性越高,您就越等待锁定。因此一个关键是管理并行性。

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

选项1:单身

一个Singleton数据库连接是最简单的方法。请注意,PostgreSQL连接一次只能运行一个查询,因此您基本上将通过单个接口序列化所有数据库访问。这对于事务来说并不合适,并且它对数据库管理器的期望有很大的限制,但是在低端服务器上,如果允许100个并发连接,则性能将远远优于您的数据库管理器。

选项2:连接池,也许PGBouncer

第二种可能性是,你可以连接到的连接池,而不是数据库,hanve的的连接池管理连接。这是最灵活的方法,因为如果需要,它可以为您提供一个解决事务问题的工具包,并且它可以更好地控制并行度,而不是从单例中获得。通过连接池,您可以指定要使用多少个连接,是否要池化事务,等等。一般来说,如果你正在寻找可扩展性,这可能是开始的地方。

主要的缺点是,这给你一个软件来管理,因此有点复杂的成本。但是它也为您提供了一个可用于管理性能的数据库连接抽象层。

相关问题