.NET SqlConnection-Klasse, Verbindungspooling und Wiederverbindungslogik

Wir haben einen Client-Code, der die SqlConnection-Klasse in .NET verwendet, um mit einer SQLServer-Datenbank zu kommunizieren. Mit diesem Fehler tritt zeitweise ein Fehler auf:

"ExecuteReader erfordert eine offene und verfügbare Verbindung. Der aktuelle Status der Verbindung ist Geschlossen."

Die "vorübergehende" Lösung besteht darin, den Prozess neu zu starten, wonach alles funktioniert - das ist jedoch offensichtlich unbefriedigend.

Der Code speichert einen Cache mit SqlConnection-Instanzen, einen für jede Datenbank.

Wir möchten den Code neu schreiben, aber bevor ich das tue, muss ich ein paar Dinge wissen:

Meine erste Frage lautet: Ist es ineffizient, SqlConnection-Objekte wiederholt zu verbinden und zu trennen, oder führt die zugrunde liegende Bibliothek in unserem Auftrag ein Verbindungspooling durch?

// Is this bad/inefficient?
for(many-times)
{
    using(SQLConnection conn = new SQLConnection(connectionString))
    {
        // do stuff with conn
    }
}

Weil unser Code es tutnicht Wenn Sie die obigen Schritte ausführen, liegt die wahrscheinliche Ursache des Problems darin, dass während der "Lebensdauer" der Verbindung etwas mit der zugrunde liegenden SQLServer-Datenbank passiert, wodurch die Verbindung geschlossen wird.

Wenn sich herausstellt, dass es sich lohnt, SqlConnection-Objekte zu "cachen", welche Methode wird empfohlen, um alle Fehler zu behandeln, die durch einfaches "erneutes Verbinden" mit der Datenbank behoben werden könnten. Ich spreche über Szenarien wie:

Die Datenbank wird offline geschaltet und wieder online geschaltet, aber der Client-Prozess hatte währenddessen keine offenen TransaktionenDie Datenbank wurde "getrennt", dann "wieder verbunden"

Ich stelle fest, dass es eine "State" -Eigenschaft bei SqlConnection gibt ... gibt es eine geeignete Möglichkeit, dies abzufragen?

Schließlich habe ich eine SQLServer-Testinstanz mit vollständigen Zugriffsrechten eingerichtet: Wie kann ich den genauen Fehler reproduzieren? "ExecuteReader erfordert eine offene und verfügbare Verbindung. Der aktuelle Status der Verbindung ist" Geschlossen ".

Antworten auf die Frage(3)

Ihre Antwort auf die Frage