Postgres Npgsql连接池

chr*_*ris 8 postgresql npgsql

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

当我使用连接字符串时:

UserID = root; Password = myPassword; Host = localhost; Port = 5432; Database = myDataBase; Pooling = true; Min Pool Size = 0; Max Pool Size = 100;

"Pooling"将在哪里举行?在我的应用程序服务器上或数据库上?

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

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

谢谢.

Sha*_*sky 16

Npgsql连接池在你的应用程序进程中实现 - 它与PostgreSQL无关,后者完全没有意识到它.

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

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

  • @ShayRojansky 感谢您的回复,请允许我祝贺您,因为您在 Npgsql 方面所做的出色工作。如果有人想深入了解如何构建连接,可以查看此链接 https://www.postgresql.org/docs/11/protocol-flow.html 。该链接从 PostgreSQL 服务器的角度描述了该过程,但我们可以了解为什么打开连接的成本很高。我们还必须添加操作系统必须执行的任务来打开、维护和关闭 TCP 连接(通过套接字)。 (6认同)
  • @ignacio是的,在本次对话的上下文中可以理解,“物理连接”指的是TCP套接字连接(创建起来非常昂贵),而不是池连接(非常轻量级)。 (3认同)
  • “设置”变量 https://www.postgresql.org/docs/current/sql-set.html 会发生什么?它们是独一无二的还是从池中重复使用的?假设我打开一个连接 connection1 并将 var 设置为“val1”。然后我打开另外 2 个连接,它们都重复使用 connection1。然后我在不同实例中为变量设置“val2”和“val3”。它安全还是可能存在竞争条件? (3认同)
  • @Serg046默认情况下,当物理连接返回到池中时,“DISCARD ALL”命令将被排队,该命令将在下次使用该连接时执行;这会将所有参数(和其他连接状态)重置为其默认值,就像打开了新的物理连接一样。这可以防止状态通过池泄漏。 (3认同)
  • 这是正确的。每个连接字符串都有自己的池,MaxPoolSize 是该连接字符串的一部分,因此也是该池设置的一部分。不同的池(和连接字符串)可以具有不同的最大池大小。因此,您可能拥有 MaxPoolSize=5 的 DB1 和 MaxPoolSize=100 的 DB2,总共有 105 个物理连接。 (2认同)
  • 构造 NpgsqlConnection 非常便宜,它是一个简单的对象分配。conn.Open 是实际打开它的东西;如果启用池并且有空闲连接可用,那么这也非常便宜。仅当您需要打开新的物理连接时,成本才会更高,而这通常是很少见的事情。 (2认同)