2010-05-05 6 views
11

배경 : 응용 프로그램을 npgsql v1에서 npgsql v2.0.9로 이동하고 있습니다. 내 응용 프로그램을 실행하는 몇 분 후, 나는 System.Exception : 풀에서 연결을 가져 오는 동안 시간 초과.npgsql Postgres DB 연결 누수 : 연결을 모니터하는 방법은 무엇입니까?

웹은 연결이 누출 되었기 때문에 발생한다고 주장합니다 (db 연결을 열지 만 제대로 닫지는 않음).

그래서

나는 npgsql에 포스트 그레스 연결을 누출 진단하는 데 노력하고있어.

주위의 다양한 웹 문헌에서. 누설 연결을 진단하는 한 가지 방법은 npgsql에 로깅을 설정하고 로그에 누설 연결 경고 메시지가 있는지 확인하는 것입니다. 문제는, 어디서나이 메시지가 로그에 표시되지 않는다는 것입니다.

또한 npgsql 연결을 모니터하는 유틸리티가 있지만 불안정하고 충돌이 발생합니다.

그래서 수동으로 코드를 검사합니다. npgsql 연결을 생성하는 모든 곳에는 finally 블록이 있습니다. datareader를 여는 모든 곳에서 CommandBehavior.CloseConnection이 사용됩니다 (그리고 datareader가 삭제됩니다).

다른 장소를 확인하거나 누군가가 누출 된 수영장 연결을 찾는 방법을 권장 할 수 있습니까?

+0

나는 똑같은 문제를 겪고 있습니다. 하지만 DbConnection.BeginTransaction 및 DbTransaction.Commit/Rollback을 사용하면 연결이 누출됩니다. 나는 모든 연결을 적절히 닫고 폐기하지만 도움을주지 않도록하고있다. 나는 그것이 Npgsql 자체와 우리 코드가 아닌 문제라고 생각한다. 해결책을 찾았 으면 알려주세요. 감사. – Fung

답변

7

업데이트 : 누수 연결이 할당 된 위치를 확인하는 더 나은 방법을 찾고 있습니다. 제발, 그것에 대해 내 게시물을 확인하십시오 : http://fxjr.blogspot.com/2012/11/better-tracing-of-npgsql-connection.html 그것이 도움이되기를 바랍니다.

편집 : 최신 베타 버전 2.0.11.91을 사용해 보시기 바랍니다. 우리는 당신을 도울 수있는 연결 풀을 개선하기위한 몇 가지 코드를 추가했습니다.

흠, 이것은 매우 이상합니다 .... 메시지를 받아야합니다.

이러한 메시지는 ms.net 런타임이 개체를 마무리 할 때만 나타납니다. 동시에 최대 기본 연결 이상을 사용하고있을 가능성이 있습니까? 내 말은, 최대 사용량이 최대 연결 수 20 개를 초과 할 수 있다는 것입니다 ...

도움이되기를 바랍니다.

제발, 당신이 무엇을 얻을지 알려주십시오.

+0

비록 내가 100으로 connectons 크랭크, 난 여전히이 예외로 끝납니다. 나는 우리가 그 많은 연결을 사용하지 않고 있다는 것을 매우 긍정적으로 생각합니다. – Alan

+1

연결 풀링을 사용하지 않고 서버에 연결이 있는지 확인할 수 있습니까? 풀링을 비활성화하려면 연결 문자열에 Pooling = false를 추가하십시오. 잠시 동안 앱을 사용하여 Pg 서버에 연결이 표시되면 연결이 누출 될 수 있습니다. 도움이되기를 바랍니다. –

+2

안녕하세요, 귀하의 도움에 감사드립니다. 제안한대로 Pooling = false를 사용하여 풀링을 사용하지 않도록 설정했습니다. 연결을 모니터하기 위해서'SELECT * FROM pg_stat_activity' SQL 쿼리를 사용하고 있습니다. 내가 본 대부분의 연결은 11이었고, 그 다음에는 3이나 4까지 수신 거부 한 뒤 1로 내려갔습니다 (SQL 쿼리의 경우). 풀링을 비활성화하면 npgsql/postgres의 성능이 크게 저하됩니다. – Alan