npgsql泄露Postgres数据库连接:如何监视连接?

12

背景:我正在将我的应用程序从npgsql v1迁移到npgsql v2.0.9。运行我的应用程序几分钟后,我会收到一个System.Exception:从池中获取连接时超时的错误。

网络上声称这是由于泄漏的连接(打开数据库连接,但未正确关闭它们)导致的。

因此,我正在尝试诊断npgsql中的泄漏postgres连接。

根据网络上的各种文献,诊断泄漏连接的一种方法是在npgsql上设置日志记录,并查找日志中的泄漏连接警告消息。问题是,我在任何地方都没有看到这条消息。

我还发现了一个监视npgsql连接的实用程序,但它不稳定并且会崩溃。

所以我只能手动检查代码。对于每个创建npgsql连接的地方,都有一个finally块来处理它。对于每个打开数据读取器的地方,使用CommandBehavior.CloseConnection(并且数据读取器被处理)。

还有其他需要检查的地方吗?或者有人可以推荐一种查找泄漏池连接的方法吗?


我遇到了完全相同的问题。但是我发现只有在使用DbConnection.BeginTransaction和DbTransaction.Commit/Rollback时才会出现连接泄漏。我确保正确关闭/释放所有连接,但没有帮助。我认为这是Npgsql本身的问题,而不是我们的代码问题。如果您已经找到解决方案,请告诉我。谢谢。 - Fung
1个回答

7
更新: 我正在努力找到更好的方法来检查那些泄漏的连接是在哪里分配的。请查看我关于此事的帖子:http://fxjr.blogspot.com/2012/11/better-tracing-of-npgsql-connection.html 希望对您有所帮助。
编辑: 您可能想尝试我们的最新测试版 2.0.11.91。 我们添加了一些代码以改进连接池,这可以帮助您。
嗯,这很奇怪... 您应该会收到一些信息。
这些消息仅在ms.net运行时完成对象时才会出现。 是否可能您同时使用超过默认最大连接数?我的意思是,您的峰值使用可能超过20个最大连接数...
希望对您有所帮助。请告诉我您得到了什么。

1
你可以尝试禁用连接池并检查服务器上是否有浮动连接。您可以通过在连接字符串中添加Pooling=false来禁用连接池。如果使用应用程序一段时间后,您在pg服务器中看到连接,则可能会泄漏连接。希望这可以帮助您。 - Francisco Junior
2
嗨,Francisco,感谢您的帮助。我按照您的建议使用Pooling=false禁用了池化。为了监视连接,我正在使用“SELECT * FROM pg_stat_activity” SQL查询。我看到的最多的连接是11,然后它回到了1(对于SQL查询),反弹到3或4,然后回落。顺便说一句,禁用池化确实会降低npgsql/postgres的性能。 - Alan
1
提示:如果在连接字符串中关闭池化,则对我来说效果非常好。 - schoetbi
即使使用最新的2.0.13 beta 1版本,仍然存在这些超时问题。现在将禁用连接池。 - Aleksey Kontsevich
2
我发现很多连接都会因为查询“UNLISTEN *”而挂起。这是怎么回事? - Chris
显示剩余3条评论

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