npgsql Утечка подключений к базе данных Postgres: способ мониторинга подключений?

Предыстория: я перемещаю свое приложение с npgsql v1 на npgsql v2.0.9. Через несколько минут запуска моего приложения я получаю System.Exception: Timeout при получении соединения из пула.

В Интернете утверждается, что это связано с утечкой соединений (открытие соединения с базой данных, но неправильное его закрытие).

So

Я пытаюсь диагностировать утечку соединений postgres в npgsql.

Из разнообразной сетевой литературы; один из способов диагностировать утечку соединения - настроить ведение журнала на npgsql и найти в журнале предупреждающее сообщение об утечке соединения. Проблема в том, что я нигде не вижу этого сообщения в логах.

Я также нашел утилиту, которая отслеживает соединения npgsql, но она нестабильна и дает сбой.

Так что мне остается вручную проверять код. Для каждого места, где создается соединение npgsql, есть блок finally, который его удаляет. Для каждого места, где открывается средство чтения данных, используется CommandBehavior.CloseConnection (и средство чтения данных удаляется).

Есть ли другие места для проверки или кто-нибудь может порекомендовать способ поиска утечек в соединениях пула?


person Alan    schedule 05.05.2010    source источник
comment
У меня точно такая же проблема. Но я обнаруживаю утечку соединений только при использовании DbConnection.BeginTransaction и DbTransaction.Commit / Rollback. Я проверяю, что закрываю / удаляю все соединения должным образом, но без помощи. Думаю, проблема в самом Npgsql, а не в нашем коде. Дайте мне знать, если вы нашли решение. Спасибо.   -  person Fung    schedule 22.03.2011


Ответы (1)


ОБНОВЛЕНИЕ: я работаю лучше, чтобы проверить, где были размещены эти соединения утечки. Пожалуйста, ознакомьтесь с моим сообщением об этом: http://fxjr.blogspot.com/2012/11/better-tracing-of-npgsql-connection.html Я надеюсь, что это поможет.

РЕДАКТИРОВАТЬ: Вы можете попробовать нашу последнюю бета-версию 2.0.11.91. Мы добавили еще код для улучшения пула соединений, который может вам помочь.

Хмммм, это очень странно .... Вы должны получать сообщения.

Эти сообщения появляются только тогда, когда среда выполнения ms.net завершает работу над объектом. Возможно ли, что вы одновременно используете больше, чем максимальное количество подключений по умолчанию? Я имею в виду, ваше пиковое использование может быть больше, чем максимальное количество подключений 20 ...

Я надеюсь, что это помогает.

Пожалуйста, дайте мне знать, что вы получите.

person Francisco Junior    schedule 05.05.2010
comment
Даже если я увеличу количество коннекторов до 100, я все равно останусь с этим исключением. Я уверен, что мы не используем так много подключений. - person Alan; 06.05.2010
comment
Можете ли вы попробовать отключить пул соединений и проверить, не видите ли вы плавающие соединения на сервере? Вы можете отключить пул, добавив Pooling = false в строку подключения. Если после использования вашего приложения в течение некоторого времени вы видите соединения на своем сервере pg, возможно, у вас утечка соединений. Я надеюсь, что это помогает. - person Francisco Junior; 11.05.2010
comment
Привет, Франциско, спасибо за вашу помощь. Я отключил объединение с помощью Pooling = false, как вы предложили. Чтобы отслеживать соединения, я использую SELECT * FROM pg_stat_activity SQL-запрос. Наибольшее количество соединений, которые я видел, было 11, затем оно снова упало до 1 (для запроса sql), отскакивая до 3 или 4 и обратно. Кроме того, отключение пула действительно снижает производительность npgsql / postgres. - person Alan; 12.05.2010
comment
Извините за задержку ... Это действительно очень странно, что вы получаете тайм-аут от пула. Я понятия не имею, что может происходить, чтобы выдать вам эту ошибку, поскольку после отключения пула соединений кажется, что соединения корректно закрываются. Как вы думаете, можно ли написать тестовый образец, где возникает эта проблема? Было бы очень полезно. Заранее спасибо. - person Francisco Junior; 31.05.2010
comment
Подсказка: если вы отключите пул в строке подключения, у меня все будет хорошо. - person schoetbi; 06.02.2013
comment
Эти таймауты по-прежнему остаются даже в последней бета-версии 2.0.13. На данный момент объединение в пул будет отключено. - person Aleksey Kontsevich; 16.10.2013
comment
Я нахожу множество зависших соединений с запросом UNLISTEN *. О чем это могло быть? - person Chris; 08.05.2014
comment
Возможно ли это в Npgsql v5? Я не вижу доступных счетчиков производительности. - person Mr Shoubs; 08.06.2021