连接池使用pg-promise

我使用Node js和Postgresql,并试图在连接实现中最有效率。
我看到pg-promisebuild立在node-postgres之上,node-postgres使用pg-pool来pipe理共享池。
我还读到,“一次有100多个客户是非常糟糕的”( node-postgres )。

我正在使用pg-promise并想知道:

  1. 对于非常大的数据负载,推荐的poolSize是多less?
  2. 如果poolSize = 100并且应用程序同时获得101请求(甚至更多),会发生什么情况? Postgres是否处理这个命令并且使得这个请求等到它可以运行?

我是pg-promise的作者。

我使用Node js和Postgresql,并试图在连接实现中最有效率。

数据库通信有几个优化级别。 其中最重要的是最小化每个HTTP请求的查询数量,因为IO是昂贵的,连接池也是如此。

  • 如果您必须为每个HTTP请求执行多个查询,请始终使用任务(通过方法任务) 。
  • 如果您的任务需要一个事务,则通过方法tx将其作为事务执行。
  • 如果您需要执行多次插入或更新,请始终使用多行操作。 请参阅在Node.js中 使用pg-promise和PostgreSQL多行更新的 多行插入 。

我看到pg-promisebuild立在node-postgres之上,node-postgres使用pg-pool来pipe理共享。

node-postgres从版本6.x开始使用pg-pool,而pg-promise保留在使用内部连接池实现的版本5.x上。 这是为什么 。

我还读到,“一次有100多个客户是非常糟糕的事情”

我在这个领域的长期实践表明:如果你不能将你的服务放到20个连接池中,那么你就不会因为build立更多的连接而得到保存,反而需要修复你的实现。 另外,如果超过20,则会给CPU带来额外的压力,这会导致进一步的减速。

对于非常大的数据负载,推荐的poolSize是多less?

数据的大小与池的大小无关。 您通常只使用一个连接进行单个下载或上传,无论多大。 除非你的实现是错误的,你最终会使用多个连接,否则你需要修复它,如果你想让你的应用程序是可扩展的。

如果poolSize = 100并且应用程序同时获得101请求,会发生什么情况

它将等待下一个可用的连接。


也可以看看:

  • 链接查询
  • 性能提升
  1. 如果poolSize = 100并且应用程序同时获得101请求(甚至更多),会发生什么情况? Postgres是否处理这个命令并且使得这个请求等到它可以运行?

对,请求会排队。 但它不是由Postgres本身处理,而是由你的应用程序( pg-pool )处理。 所以,当你的空闲连接用完,应用程序将等待一个连接释放,然后下一个待处理的请求将被执行。 这是游泳池的用途。

  1. 对于非常大的数据负载,推荐的poolSize是多less?

这真的取决于很多因素,没有人会真正告诉你确切的数字。 为什么不在巨大的负载下testing你的应用程序,并在实践中看到它如何执行,并find瓶颈。


另外我发现node-postgres文档在这个问题上相当混乱和误导:

一旦你获得了大于100的同时请求,你的web服务器将尝试打开100个到PostgreSQL后端的连接,并且你将在PostgreSQL服务器上用完内存,你的数据库将不会响应,你的应用程序似乎会挂起,打破。 Boooo!

https://github.com/brianc/node-postgres

这不是真的。 如果您在Postgres方面达到连接限制,则只有在先前的连接closures之后,才能build立新的连接。 如果在节点应用程序中处理这种情况,什么都不会中断。