关闭连接后仍然保持空闲状态

23

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

我使用了.Close()方法,但是,如果我在Postgres DB的pg_stat_activity表上检查,我可以看到该连接仍处于IDLE状态。 我该如何解决这个问题? 是否可能彻底关闭连接?

谢谢, 安德烈亚


我想了解让它处于空闲状态是否是一个问题。我只是好奇! - Ismael
拥有最大连接数为100和200个客户端,是的,没错 :) - Andrea Girardi
同一个问题的另一种解决方法是让100-200个客户端连接到您编写的单个服务器应用程序(可能是IIS上的Web应用程序),然后该应用程序成为数据库的单个客户端。除其他事项外,它还允许您更加严格地锁定postgresql。采用这种方法,您需要撤销我在答案中建议的内容,因为您希望池化意味着少数连接在所有这些100-200个用户之间共享。 - Jon Hanna
1
@Andrea Girardi 是的!我没想到那个!太明显了!谢谢。 - Ismael
@Jon Hanna 谢谢您的建议,非常有帮助!我会记住这个项目和下一个项目! - Andrea Girardi
我认为值得指出的是,Npgsql还有一个MinPoolSize属性,它控制着Npgsql应该保持多少个空闲连接。经过一段时间后,Npgsql将开始关闭超过minpoolsize值的空闲连接。这样,即使您在某个时刻打开了100或200个连接,Npgsql也不会一直保持它们处于空闲状态,并最终开始关闭它们。当然,除非您更改了minpoolsize的值。希望对您有所帮助。 - Francisco Junior
1个回答

33
与大多数ADO.NET提供程序相似,Npgsql默认使用连接池。当您Close() NpgsqlConnection对象时,表示Npgsql实际使用的底层连接的内部对象会进入池中以便于重复使用,这样可以节省创建不必要连接的开销。(有关更多信息,请参见打开连接到底意味着什么?)。
对于大多数应用程序而言,这种方式很适合,因为在一秒钟内想要多次使用连接是很常见的。
但它可能完全不适合你,如果你在连接字符串中包含Pooling=false选项,则将覆盖此默认设置,并且Close()确实会关闭实际连接。

5
这就是我喜欢这个网站的原因!非常熟练的人很快回复!感谢帮助! - Andrea Girardi
有没有可能在关闭时停止轮询并关闭所有“后台”连接? - Dominic Jonas
啊,抱歉,问题问错了:即使 pooling = true,是否有可能关闭所有连接? - Dominic Jonas
7
使用NpgsqlConnection.ClearPool()可以清除与特定连接相关联的池,使用NpgsqlConnection.ClearAllPools()可以清除所有连接池。 - Jon Hanna

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