.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 ".