2009-06-19 6 views
5

Ich hatte den Verdacht, dass eine Datenbankverbindung in einer unserer Anwendungen nicht immer geschlossen ist. Ich ging, um den Code zu sehen, und ich habe eine Klasse DataProvider gefunden, die SqlConnection Objekt hat. Die Verbindung wird im Konstruktor dieser Klasse geöffnet und in ihrer Dispose Methode geschlossen (beurteile das nicht, ich weiß, dass das Behalten einer offenen Verbindung böse ist, es ist einfach nicht mein Code und es ist sowieso nicht der Punkt der Frage). Die Dispose Verfahren werden wie folgt durchgeführt:Schließen einer Datenbankverbindung in Dispose-Methode ist richtig?

protected virtual void Dispose(bool disposing) 
{ 
    if (!_disposed) 
    { 
     if (disposing) 
     { 
      if (_conn != null) 
       _conn.Close(); 
     } 

     _disposed = true; 
    } 
} 

Die Frage ist:
Ist es garantiert immer, dass die Verbindung geschlossen ist?
Ist dieser Code richtig?

Ich denke, es sollte genannt werden - bin ich richtig und könnte es sich auswirken, die Verbindung nicht zu schließen (wahrscheinlich nicht)?

+0

Wenn Sie einen Verdacht haben, bestätigen Sie mit Hilfe der Leistungsindikatoren. – RichardOD

+0

Ein zu überprüfender Schlüsselwert ist NumberOfPooledConnections. – RichardOD

Antwort

8

Dispose wird nie automatisch aufgerufen.

Die Verbindung wird erst geschlossen, wenn die Dispose-Methode des Objekts explizit genannt wird, oder wenn Sie Ihre Klasse in in a verwendet() verwendet Block

Ein sicherer Weg, um die dispose-Methode in Ihrem Finalizerthread anrufen und Stellen Sie sicher, dass der Finalizer beim Aufruf der Dispose-Methode unterdrückt wird.

This article vorhanden der richtige Weg, um das Muster

Hoffe, es hilft zu implementieren!

Cédric

+0

ok, aber wenn die Anwendung geschlossen wird (normalerweise oder durch einen Fehler) wird die dispose-Methode aufgerufen und die Verbindung wird geschlossen? – agnieszka

+0

Wenn Ihre Anwendung heruntergefahren wird, sollten alle Finalizer vom Garbage Collector aufgerufen werden, so dass zumindest die Verbindungen geschlossen werden, da der Finalizer der Connection-Objekte ausgelöst wird ... aber das ist eine lahme Möglichkeit, eine Verbindung zu schließen; o) –

+1

Und übrigens: Dispose-Methode wird nie automatisch aufgerufen.In Ihrem aktuellen Zustand des Codes sind Verbindungen geschlossen, weil die dispose-Methode von Connection in ihren Finalizern aufgerufen wird –

2

conn.Dispose(); schließt auch die Verbindung, so kann es nicht schaden, sie zu ändern, um dem Entsorgungsmuster zu folgen.

Aber dort funktional gleichwertig, so muss es ein Problem wo sonst sein.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

Wenn der SqlConnection Umfang aus geht, wird es nicht geschlossen werden. Daher müssen Sie die -Verbindung explizit durch Aufrufen von Close oder Dispose schließen. Schließen und Entsorgen sind funktional gleichwertig. Wenn der Pooling-Wert Pooling auf True oder Ja festgelegt ist, wird die zugrunde liegende Verbindung zurück an den Verbindungspool zurückgegeben. Wenn jedoch Pooling auf false oder no gesetzt ist, ist die zugrunde liegende Verbindung zum Server geschlossen.