Wir haben Clientcode, der die SqlConnection-Klasse in .NET verwendet, um mit einer SQLServer-Datenbank zu kommunizieren. Es wird intermittierend mit diesem Fehler Fehler:.NET SqlConnection-Klasse, Verbindungs-Pooling und Reconnection-Logik
„ExecuteReader erfordert eine offene und verfügbare Verbindung Die aktuelle Status der Verbindung ist geschlossen.“
Die „vorübergehende“ Lösung ist, den Prozess neu zu starten, nach dem alles funktioniert - aber das ist offensichtlich unbefriedigend.
Der Code speichert einen Cache für SqlConnection-Instanzen, einen für jede Datenbank.
Wir möchten den Code neu zu schreiben, aber bevor ich das tue, ich brauche ein paar Dinge wissen:
Meine erste Frage ist: Ist es ineffizient wiederholt anschließen und SqlConnection Objekte trennen, oder tut Die zugrunde liegende Bibliothek führt das Verbindungs-Pooling für uns durch?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
Weil unser Code tut nicht die oben tun, was scheint die wahrscheinliche Ursache des Problems ist, dass etwas auf die zugrunde liegende SQL Server-Datenbank während der „Lebensdauer“ der Verbindung geschieht, die die Verbindung verursacht geschlossen werden ...
Wenn sich herausstellt, dass es sich lohnt, SqlConnection-Objekte zu "cachen", was ist der empfohlene Weg, alle Fehler zu behandeln, die einfach durch "Wiederverbinden" mit der Datenbank gelöst werden können. Ich spreche von Szenarien wie:
- Die Datenbank offline genommen und wieder online, aber der Client-Prozess hatte keine offene Transaktionen, während dies geschieht
- Die Datenbank „getrennt“ war, dann „wieder angeschlossen "
Ich bemerke, dass es eine" State "-Eigenschaft auf SqlConnection gibt ... Gibt es eine geeignete Möglichkeit, das abzufragen?
Schließlich habe ich einen Test SQLServer-Instanz mit vollen Zugriffsrechten einrichten: Wie kann ich die genaue Fehler reproduzieren gehen über „ExecuteReader eine offene und verfügbare Verbindung erfordert die aktuellen Status der Verbindung ist geschlossen“
Was ich mir erhofft hatte ... Irgendwelche Ideen, wie ich den genauen Fehler, den wir sehen, reproduzieren könnte? (nur um zu "beweisen", dass ich das Problem behoben habe)? –
Schwer zu sagen, um ehrlich zu sein. Es könnte leicht eine Race-Bedingung sein, wenn Sie versuchen, die gleiche Verbindung aus mehreren Threads zu verwenden. –
So deaktivieren Sie das Verbindungs-Pooling: Fügen Sie "Pooling = False" hinzu. zu der Verbindungszeichenfolge. – Richard