Postgres Npgsql 连接池

Posted

技术标签:

【中文标题】Postgres Npgsql 连接池【英文标题】:Postgres Npgsql Connection Pooling 【发布时间】:2017-10-31 12:45:49 【问题描述】:

在使用 Npgsql for Postgres 时,我想更好地理解 连接池。 (http://www.npgsql.org/)

当我使用连接字符串时:

UserID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;Pooling=true;最小池大小=0;最大池大小=100;

“池化”将在哪里进行?在我的应用服务器上还是在数据库上?

当我调用connection.Open() 时,会发生什么?如果存在,是否从池中获取连接,如果不存在,则创建一个池?

任何其他有关连接池的一般信息将不胜感激。

谢谢。

【问题讨论】:

最小和最大池大小现在命名为:“最小池大小”和“最大池大小”npgsql.org/doc/connection-string-parameters.html#pooling 【参考方案1】:

Npgsql 连接池是在你的应用程序进程中实现的——它与 PostgreSQL 无关,它完全不知道它。

机制非常简单。当您关闭池连接时,物理连接不是物理关闭与 PostgreSQL 的连接,而是在内存中保持空闲(在“池”中)。下次打开新连接时,如果其连接字符串与池中已存在的物理连接匹配,则重用该物理连接,而不是打开新的物理连接。

由于打开/关闭物理连接是一个昂贵的过程,这会大大加快您的应用程序的速度。

【讨论】:

谢谢你,谢伊。欣赏信息。 @ignacio 是的,在此对话的上下文中可以理解,“物理连接”是指 TCP 套接字连接(创建起来非常昂贵),而不是池连接(非常轻量级) )。 @ShayRojansky 感谢您的回复,请让我祝贺您,因为您使用 Npgsql 所做的出色工作。如果有人想深入了解如何建立连接,可以查看此链接postgresql.org/docs/11/protocol-flow.html。该链接从 PostgreSQL 服务器的角度描述了该过程,但我们可以了解为什么打开连接的成本很高。我们还必须添加操作系统必须执行的任务来打开、维护和关闭 TCP 连接(通过套接字)。 没错。每个连接字符串都有自己的池,MaxPoolSize 是该连接字符串的一部分,也是该池设置的一部分。不同的池(和连接字符串)可以有不同的最大池大小。所以你可能有 MaxPoolSize=5 的 DB1 和 MaxPoolSize=100 的 DB2,总共有 105 个物理连接。 @Serg046 默认情况下,当一个物理连接返回到池中时,一个DISCARD ALL命令被排队,它将在下次使用该连接时执行;这会将所有参数(和其他连接状态)重置为其默认值,就像打开了一个新的物理连接一样。这可以防止状态通过池泄漏。

以上是关于Postgres Npgsql 连接池的主要内容,如果未能解决你的问题,请参考以下文章

Hikari 连接池 postgres

如何优化 Postgresql max_connections 和 node-postgres 连接池?

npgsql Leaking Postgres DB Connections:监控连接的方法?

使用 pg-promise 的连接池

HikariCP 连接池 - '活动' - 如何调试?

如何处理网络中断和连接池