Nein, es ist nicht ineffizient, viele %code% -Objekte zu erstellen und jedes einzelne zu schließen, wenn Sie fertig sind. Das ist genau das Richtige. Lassen Sie das .NET Framework Connection Pooling seine Arbeit machen - versuchen Sie es nicht selbst. Sie müssen nichts spezielles tun, um das Verbindungspooling zu aktivieren (obwohl Sie es deaktivieren können, indem Sie %code% in Ihrer Verbindungszeichenfolge setzen).
Es gibt viele Dinge, die schief gehen könnten, wenn Sie versuchen, die Verbindung selbst zu cachen. Sag einfach nein:)
In meiner jüngsten Erfahrung, wenn Sie diesen Code verwenden:
%Vor%hat einen Fehler und schließt die Verbindung nicht explizit, sie wird nicht geschlossen oder in den Pool zurücküberprüft. Verwenden Sie also einen Catch- oder Finally-Block, um die Verbindung zu schließen
Wir haben einen Clientcode, der die SqlConnection-Klasse in .NET verwendet, um mit einer SQLServer-Datenbank zu kommunizieren. Es schlägt mit diesem Fehler zeitweise fehl:
"ExecuteReader benötigt eine offene und verfügbare Verbindung. Der aktuelle Status der Verbindung ist Closed"
Die "temporäre" Lösung besteht darin, den Prozess neu zu starten, danach funktioniert alles - aber das ist offensichtlich nicht zufriedenstellend.
Der Code speichert einen Cache für SqlConnection-Instanzen, einen für jede Datenbank.
Wir würden den Code gerne 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 das Verbindungs-Pooling für uns durch?
%Vor%Da unser Code nicht tut, scheint die wahrscheinliche Ursache des Problems darin zu liegen, dass während der "Lebensdauer" der Verbindung, die die Verbindung verursacht, etwas mit der zugrunde liegenden SQLServer-Datenbank passiert geschlossen ...
Wenn es sich herausstellt, dass es sich lohnt, SqlConnection-Objekte zu "cachen", was ist der empfohlene Weg, um alle Fehler zu behandeln, die einfach durch "Wiederverbinden" mit der Datenbank gelöst werden können. Ich spreche über Szenarien wie:
Ich bemerke, dass es eine "State" -Eigenschaft in SqlConnection gibt ... gibt es eine geeignete Möglichkeit, das abzufragen?
Schließlich habe ich eine Test-SQLServer-Instanz mit vollen Zugriffsrechten eingerichtet: Wie kann ich den genauen Fehler reproduzieren? "ExecuteReader benötigt eine offene und verfügbare Verbindung. Der aktuelle Status der Verbindung ist Closed"
Sie sollten Verbindungspooling für Ihre Verbindungszeichenfolge aktivieren . In diesem Fall fügt die Laufzeitumgebung Ihre Verbindungen zum "Pool" zurück, wenn Sie sie schließen, anstatt wirklich zu disconnecting. Wenn eine 'neue' Verbindung aus dem Pool genommen wird, wird sie zurückgesetzt (dh sp_reset_connection wird aufgerufen) und dann Ihrer Anwendung als brandneue, frische Verbindung präsentiert. Der Pool behandelt solche Fälle transparent, als ob die Verbindung im Leerlauf im Pool geschlossen wäre.
Die Kosten für das Erstellen einer neuen Verbindung von Grund auf neu sind von Bedeutung, da die Authentifizierung mehrere Roundtrips zwischen Client und Server erfordert (abhängig von der Authentifizierungsmethode und SSL-Einstellungen kann es im besten Fall 1 Roundtrip vs. etwa 10 sein ).
Und um Ihre Frage zu beantworten, werfen Sie einen Blick auf die OnStateChange Ereignis, wenn sich ihr Status ändert, aber Sie sollten sich nicht darum kümmern, wenn Sie das Pooling verwenden.