连接池使用pg-promise
我使用Node js和Postgresql,并试图在连接实现中最有效率。
我看到pg-promisebuild立在node-postgres之上,node-postgres使用pg-pool来pipe理共享池。
我还读到,“一次有100多个客户是非常糟糕的”( node-postgres )。
我正在使用pg-promise并想知道:
- 对于非常大的数据负载,推荐的poolSize是多less?
- 如果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请求,会发生什么情况
它将等待下一个可用的连接。
也可以看看:
- 链接查询
- 性能提升
- 如果poolSize = 100并且应用程序同时获得101请求(甚至更多),会发生什么情况? Postgres是否处理这个命令并且使得这个请求等到它可以运行?
对,请求会排队。 但它不是由Postgres本身处理,而是由你的应用程序( pg-pool
)处理。 所以,当你的空闲连接用完,应用程序将等待一个连接释放,然后下一个待处理的请求将被执行。 这是游泳池的用途。
- 对于非常大的数据负载,推荐的poolSize是多less?
这真的取决于很多因素,没有人会真正告诉你确切的数字。 为什么不在巨大的负载下testing你的应用程序,并在实践中看到它如何执行,并find瓶颈。
另外我发现node-postgres
文档在这个问题上相当混乱和误导:
一旦你获得了大于100的同时请求,你的web服务器将尝试打开100个到PostgreSQL后端的连接,并且你将在PostgreSQL服务器上用完内存,你的数据库将不会响应,你的应用程序似乎会挂起,打破。 Boooo!
https://github.com/brianc/node-postgres
这不是真的。 如果您在Postgres方面达到连接限制,则只有在先前的连接closures之后,才能build立新的连接。 如果在节点应用程序中处理这种情况,什么都不会中断。