关闭后连接仍然空闲
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()
将它们全部清除。以上是关于关闭后连接仍然空闲的主要内容,如果未能解决你的问题,请参考以下文章
Python Tornado Websocket连接在关闭后仍然打开