我有一个Node.js应用程序使用PostgreSQL通过node-postgres。我已经开始收到错误“抱歉,已经有太多客户端”,这让我想知道我是创建了太多的客户端对象,还是我应该手动断开它们。目前,我正在使用访问数据库的每个函数调用创建一个新的客户端对象。例如:
var db {
checkDetails : function() {
var client = new pg.Client(conString);
...
},
amendDetails : function() {
var client = new pg.Client(conString);
...
},
...
}
这是正确的还是我应该在别处创建一个客户端对象?或者我应该致电client.end()
?由于我使用的回调样式的示例不包括此,我认为这是不必要的。
答案 0 :(得分:0)
这里有相当多的有效选择,包括继续你当前的方法,添加像PgBouncer这样的东西来使用单身人士。这些有不同的考虑因素,因此选择哪个更好可能取决于您的具体情况。但是我会在这里提到这两个选项之间的权衡。
首先是一些基础知识
PostgreSQL与所有其他RDBMS一样,必须协调各种进程之间的数据访问。通常,数据访问端的并行性越多,等待锁的次数就越多。因此,一个关键是管理并行性。
一方面,PostgreSQL上的单个连接永远不会扩展到数据库服务器的单个核心和单个硬盘驱动器主轴之外。事实上,它永远不会扩展到这一点。另一方面,除非你有50个核心和非常快的硬盘驱动器,否则100个连接最终将花费大部分时间等待其他进程,所以你需要在开始之前了解这种权衡。
选项1:单身人士
单例数据库连接是最简单的方法。请注意,PostgreSQL连接一次只能运行一个查询,因此您实际上将通过单个接口序列化所有数据库访问。这不适用于事务,并且它对数据库管理器的期望有很大的限制,但是在低端服务器上,如果允许100个并发连接,您将获得更好的性能。
选项2:连接池,可能使用PGBouncer
第二种可能性是您可以连接到连接池,而不是数据库,并且连接池可以管理连接。这是最灵活的方法,因为它为您提供了一个工具包,用于解决事务,如果您需要,并且它允许更好地控制并行性,而不是单个单元。使用连接池,您可以指定要使用的连接数,是否汇集事务等。一般来说,如果您正在寻找可扩展性,这可能就是您的起点。
主要缺点是,这为您提供了另外一个软件来管理,因此需要一点复杂的成本。但是,它还为您提供了一个可用于管理性能的数据库连接的抽象层。