npgsql Leaking Postgres DB Connections:监控连接的方法?

Posted

技术标签:

【中文标题】npgsql Leaking Postgres DB Connections:监控连接的方法?【英文标题】:npgsql Leaking Postgres DB Connections: Way to monitor connections? 【发布时间】:2011-02-16 01:23:22 【问题描述】:

背景:我正在将我的应用程序从 npgsql v1 移动到 npgsql v2.0.9。运行我的应用程序几分钟后,我收到 System.Exception: Timeout while getting a connection from the pool。

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

所以

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

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

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

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

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

【问题讨论】:

我遇到了完全相同的问题。但是我发现只有在使用 DbConnection.BeginTransaction 和 DbTransaction.Commit/Rollback 时才会发生连接泄漏。我确保我也正确关闭/处理所有连接,但没有帮助。我认为这是 Npgsql 本身的问题,而不是我们的代码。如果您找到了解决方案,请告诉我。谢谢。 【参考方案1】:

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

编辑:您可能想尝试我们最新的测试版 2.0.11.91。我们添加了更多代码来改进可以帮助您的连接池。

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

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

希望对你有帮助。

请告诉我你得到了什么。

【讨论】:

即使我将连接数提高到 100,我仍然会遇到这个异常。我很肯定我们没有使用那么多连接。 您可以尝试禁用连接池并检查您是否看到连接在服务器中浮动?您可以通过在连接字符串中添加 Pooling=false 来禁用池。如果在使用您的应用程序一段时间后,您在 pg 服务器中看到连接,则您可能正在泄漏连接。我希望它有所帮助。 您好弗朗西斯科,感谢您的帮助。我按照您的建议使用 Pooling=false 禁用了池化。为了监控连接,我使用SELECT * FROM pg_stat_activity SQL 查询。我看到的最多连接是 11,然后它回落到 1(对于 sql 查询)反弹到 3 或 4 并回落。顺便说一句,禁用池确实会降低 npgsql/postgres 的性能。 提示:如果你关闭连接字符串中的池,那么它对我来说非常有用。 我发现很多以“UNLISTEN *”作为查询的挂起连接。那可能是关于什么的?

以上是关于npgsql Leaking Postgres DB Connections:监控连接的方法?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 .NET 应用程序 (Npgsql) 连接到 Heroku Postgres

对 ExecuteNonQuery 的 Postgres 函数(通过 npgsql)调用返回 -1 作为受影响行的结果

Npgsql 如何处理失败的事务?

使用 npgsql 在 c# 中插入

Npgsql 异常:列 c.consrc 不存在

执行迁移时,Npgsql无法找到NpgsqlException