Postgres Npgsql 连接池

43
我想更好地了解在使用Npgsql连接Postgres时的“连接池”,具体内容请参考链接:http://www.npgsql.org/。当我使用以下连接字符串时:“UserID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;Pooling=true;Minimum Pool Size=0;Maximum Pool Size=100;”,“Pooling”将在哪里进行?在我的应用服务器上还是数据库上?当我调用connection.Open()时,会发生什么?如果存在连接,则从池中取出一个连接,如果不存在,则创建一个池?欢迎提供有关连接池的其他一般信息。谢谢。

最小池大小和最大池大小现在被命名为:“最小池大小”和“最大池大小”。 - mpiliszcz
1个回答

67

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

这个机制非常简单。当您关闭一个池化的连接时,物理连接不会被直接关闭到PostgreSQL,而是将物理连接保留在内存中空闲(在“池”中)。下次打开新连接时,如果其连接字符串与已经存在于池中的物理连接匹配,那么将重用该物理连接,而不是打开新的物理连接。

由于打开/关闭物理连接是一个昂贵的过程,因此这样可以显着加快应用程序的速度。


3
@ignacio 是的,在这次对话的语境中,“物理连接”指的是TCP套接字连接(创建非常昂贵),而不是池化连接(非常轻量级)。 - Shay Rojansky
6
@ShayRojansky,谢谢您的回复。我要祝贺您做得很好,Npgsql非常棒。如果有人想深入了解连接是如何建立的,可以查看此链接:https://www.postgresql.org/docs/11/protocol-flow.html 。该链接描述了从PostgreSQL服务器的角度来看连接建立的过程,但我们可以大致了解为什么打开连接是昂贵的。我们还必须考虑操作系统打开、维护和关闭TCP连接(通过套接字)所需执行的任务。 - Ignacio
2
没错。每个连接字符串都有自己的池,而MaxPoolSize是该连接字符串的一部分,因此也是该池的设置的一部分。不同的池(和连接字符串)可以具有不同的最大池大小。因此,您可能会拥有MaxPoolSize = 5的DB1和MaxPoolSize = 100的DB2,总共有105个物理连接。 - Shay Rojansky
3
“set”变量 https://www.postgresql.org/docs/current/sql-set.html 会发生什么?它们是唯一的还是从池中重新使用?假设我打开一个连接connection1并将变量设置为“val1”。然后我打开另外两个连接,它们都重用connection1。然后我在不同的实例中为变量设置“val2”和“val3”。这样安全吗?还是可能存在竞争条件? - Serg046
6
默认情况下,当将物理连接返回到池中时,会排队一个“DISCARD ALL”命令,该命令将在下次使用该连接时执行。这将重置所有参数(以及其他连接状态)为它们的默认值,就像打开了一个新的物理连接一样。这可以防止通过池泄漏状态。 - Shay Rojansky
显示剩余24条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接