关闭后连接仍然空闲

Posted

技术标签:

【中文标题】关闭后连接仍然空闲【英文标题】:Connection still idle after close 【发布时间】:2012-02-20 10:42:03 【问题描述】:

我有一个 C# 客户端应用程序,需要每 15 分钟检查一次 Postgres 数据库上的表。问题是我需要将此客户端安装到或多或少 200 个客户端中,因此我需要在查询后关闭数据库连接。

我使用 .Close() 方法,但是,如果我检查 Postgres DB 上的 pg_stat_activity 表,我可以看到连接仍然在 IDLE 状态下打开。我该如何解决这个问题?是否可以确定关闭连接?

谢谢, 安德里亚

【问题讨论】:

我想了解让它空闲状态是否有问题。我只是好奇! 与 100 和 200 个客户端的最大连接数,是的,它是 :) 解决同一问题的另一种方法是让 100-200 个客户端连接到您编写的单个服务器应用程序(可能是 IIS 上的 Web 应用程序),然后它成为数据库的单个客户端.除此之外,它还允许您更多地锁定 postgresql。使用这种方法,您会想要撤消我在回答中的建议,因为您希望池化意味着在所有这 100-200 个用户之间共享少量连接。 @Andrea Girardi 是的!我没想到!太明显了!谢谢。 @Jon Hanna 感谢您的建议,真的很有帮助!我会牢记那个项目和下一个项目! 【参考方案1】:

与大多数 ADO.NET 提供程序一样,Npgsql 默认使用连接池。当您 Close() NpgsqlConnection 对象时,表示 Npgsql 使用的实际底层连接的内部对象进入一个池以重新使用,从而节省了不必要地创建另一个的开销。 (更多信息请参见What does "opening a connection" actually mean?)。

这非常适合大多数应用程序,因为在一秒钟内多次使用连接是很常见的。

它根本不适合你,但如果你在连接字符串中包含选项Pooling=false,它将覆盖此默认值,Close() 确实会关闭实际连接。

【讨论】:

这就是我喜欢这个网站的原因!来自非常熟练的人的快速响应!感谢您的帮助! 是否有可能在关机时停止轮询并关闭所有“后台”连接? 啊抱歉,错误的问题:即使pooling = true 也可以关闭所有连接吗? @DominicJonas 使用NpgsqlConnection.ClearPool() 清除与特定连接关联的池,NpgsqlConnection.ClearAllPools() 将它们全部清除。

以上是关于关闭后连接仍然空闲的主要内容,如果未能解决你的问题,请参考以下文章

如何自动关闭 PostgreSQL 中的空闲连接?

Python Tornado Websocket连接在关闭后仍然打开

强制路由器保持空闲 UDP 端口打开

即使关闭连接后,数据仍然存在于h2数据库表中

HikariCP 未在 close() 上关闭连接(连接泄漏)

为啥hibernate关闭连接后h2的数据库文件仍然会被锁定一段时间?