2010-05-05 13 views
11

Hintergrund: Ich verschiebe meine Anwendung von npgsql v1 zu npgsql v2.0.9. Nach ein paar Minuten der Ausführung meiner Anwendung erhalte ich eine System.Exception: Timeout, während ich eine Verbindung aus dem Pool erhalte.npgsql Undichte Postgres DB-Verbindungen: Möglichkeit, Verbindungen zu überwachen?

Das Netz behauptet, dass dies auf undichte Verbindungen zurückzuführen ist (Öffnen einer Db-Verbindung, aber nicht ordnungsgemäß schließen).

So

Ich versuche, Postgres Verbindungen in Npgsql zu diagnostizieren undicht.

Aus den verschiedenen Web-Literatur herum; Eine Möglichkeit, austretende Verbindungen zu diagnostizieren, besteht darin, die Protokollierung von npgsql einzurichten und im Protokoll auf die Warnmeldung für eine undichte Verbindung zu prüfen. Problem ist, ich sehe diese Nachricht in den Protokollen nirgends.

Ich fand auch Dienstprogramm, das npgsql Verbindungen überwacht, aber es ist instabil und stürzt ab.

So bin ich links, Code manuell zu überprüfen. Für jeden Ort, der eine npgsql-Verbindung erstellt, gibt es schließlich einen Block, der ihn entsorgt. Für alle Orte, die einen Datenreader öffnen, wird CommandBehavior.CloseConnection verwendet (und der Datenreader wird abgelegt).

Irgendwelche anderen Orte zu überprüfen oder kann jemand eine Möglichkeit empfehlen, nach undichten Poolverbindungen zu suchen?

+0

Ich habe genau das gleiche Problem. Aber ich finde Verbindungen nur undicht, wenn ich DbConnection.BeginTransaction und DbTransaction.Commit/Rollback verwende. Ich sorge dafür, dass ich alle Verbindungen richtig schließe/entsorge, aber keine Hilfe. Ich denke, es ist ein Problem mit Npgsql selbst und nicht mit unserem Code. Lass es mich wissen, wenn du die Lösung gefunden hast. Vielen Dank. – Fung

Antwort

7

UPDATE: Ich arbeite auf eine bessere Weise zu überprüfen, wo diese Leckverbindungen zugeordnet wurden. Bitte überprüfen Sie meine Post darüber: http://fxjr.blogspot.com/2012/11/better-tracing-of-npgsql-connection.html Ich hoffe, es hilft.

EDIT: Vielleicht möchten Sie unsere neueste Beta-Version 2.0.11.91 versuchen. Wir haben etwas mehr Code hinzugefügt, um den Verbindungspool zu verbessern, der Ihnen helfen kann.

Hmmmm, das ist sehr seltsam .... Sie sollten einige Nachrichten bekommen.

Diese Nachrichten werden nur angezeigt, wenn die ms.net-Laufzeit das Objekt jedoch finalisiert. Wäre es möglich, dass Sie mehr als Standard-Max-Verbindungen gleichzeitig verwenden? Ich meine, Ihre maximale Nutzung kann mehr als die 20 maximalen Anzahl Verbindungen sein ...

Ich hoffe, es hilft.

Bitte lassen Sie mich wissen, was Sie bekommen.

+0

Auch wenn ich die connectons auf 100 hochgebe, habe ich immer noch diese Ausnahme. Ich bin ziemlich positiv, dass wir nicht so viele Verbindungen verwenden. – Alan

+1

Können Sie versuchen, das Verbindungspooling zu deaktivieren und überprüfen, ob Verbindungen auf dem Server verfügbar sind? Sie können das Pooling deaktivieren, indem Sie in Ihrer Verbindungszeichenfolge Pooling = false hinzufügen. Wenn nach der Verwendung Ihrer App für eine Weile Verbindungen in Ihrem PG-Server angezeigt werden, können Verbindungen verloren gehen. Ich hoffe es hilft. –

+2

Hallo Francisco, Danke für deine Hilfe. Ich habe das Pooling mit Pooling = false deaktiviert, wie Sie es vorgeschlagen haben. Um Verbindungen zu überwachen, verwende ich die SQL-Abfrage 'SELECT * FROM pg_stat_activity'. Die meisten Verbindungen, die ich sah, waren 11, dann ging es wieder zurück auf 1 (für die SQL-Abfrage) und sprang auf 3 oder 4 und wieder zurück. Nebenbei, das Deaktivieren von Pooling verlangsamt wirklich die Leistung von npgsql/postgres. – Alan

Verwandte Themen