npgsql泄漏Postgres数据库连接:监控连接的方法?

Ala*_*lan 11 c# postgresql connection-pooling pooling npgsql

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

网络声称这是由于连接泄漏(打开数据库连接,但没有正确关闭它们).

所以

我正在尝试诊断npgsql中泄漏的postgres连接.

来自各种网络文学; 诊断泄漏连接的一种方法是在npgsql上设置日志记录,并在日志中查找泄漏的连接警告消息.问题是,我没有在任何地方的日志中看到此消息.

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

所以我手动检查代码.对于创建npgsql连接的每个场所,都有一个finally块处理它.对于打开datareader的每个场所,都使用CommandBehavior.CloseConnection(并且处理了datareader).

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

Fra*_*ior 7

更新:我正在以更好的方式检查这些泄漏连接的分配位置.请检查我的帖子:http://fxjr.blogspot.com/2012/11/better-tracing-of-npgsql-connection.html 我希望它有所帮助.

编辑:您可能想尝试我们最新的测试版2.0.11.91.我们添加了一些代码来改进连接池,这可以帮助您.

嗯,这很奇怪......你应该得到一些消息.

这些消息仅在ms.net运行时确定对象时出现.您是否有可能同时使用超过默认的最大连接数?我的意思是,您的峰值使用量可能超过20个最大数量连接...

我希望它有所帮助.

请让我知道你得到了什么.

  • 您好Francisco,感谢您的帮助.我建议您使用Pooling = false禁用池化.为了监视连接,我使用`SELECT*FROM pg_stat_activity` SQL查询.我看到的大多数连接是11,然后它回到1(对于sql查询)弹跳到3或4然后退回.顺便说一下,禁用池确实会降低npgsql/postgres的性能. (2认同)
  • 我找到了很多与"UNLISTEN*"作为查询的悬挂连接.那可能是什么? (2认同)