Denken Sie daran, dass dies alles im Kontext des .Net-Ökosystems steht.
Entwickler möchten manchmal ihren Code "optimieren", um ihre Verbindungsobjekte wiederzuverwenden. Angesichts des Zusammenhangs dieser Frage ist dies fast immer ein Fehler.
ADO.Net verfügt über eine Funktion namens Verbindungspooling . Wenn Sie ein neues Verbindungsobjekt erstellen und öffnen, fordern Sie in Wirklichkeit eine Verbindung aus einem Pool an. Wenn Sie eine Verbindung schließen, geben Sie sie an den Pool zurück.
Es ist wichtig, die Objekte zu verstehen, die wir direkt im Code verwenden: SqlConnection, MySqlConnection, OleDbConnectio usw. sind alles nur Wrapper um eine echte zugrunde liegende Verbindung, die von ADO.Net verwaltet wird, und die echten ADO.Net-Verbindungen sind viel "schwerer" und teurer vom Standpunkt der Leistung. Es sind diese zugrunde liegenden Objekte, die Probleme mit der Authentifizierung, dem Netzwerktransit und der Verschlüsselung haben, und diese Dinge überwiegen bei weitem die geringe Menge an Speicher in dem Objekt, die Sie tatsächlich in Ihrem eigenen Code sehen.
Wenn Sie versuchen, Ihr Verbindungsobjekt wiederzuverwenden, unterbrechen Sie die Fähigkeit von ADO.Net, die wichtigen zugrunde liegenden Verbindungen effektiv zu verwalten. Sie erzielen Effizienz im Kleinen auf Kosten des Großen.
Die erneute Verwendung einer Verbindung über eine Anwendung oder eine http-Anforderung hinweg kann Sie auch dazu zwingen, versehentlich etwas zu serialisieren, das ansonsten möglicherweise parallel ausgeführt werden kann, und zu einem Leistungsengpass führen. Ich habe dies in realen Anwendungen gesehen.
Im Fall des hier gezeigten Webseitenbeispiels, in dem Sie zumindest die kleine Verbindung für die Dauer einer einzelnen http-Anforderung / Antwort beibehalten, können Sie noch effizienter werden, indem Sie auswerten, welche Abfragen in Ihrer Anforderungspipeline ausgeführt werden, und versuchen, diese abzurufen Sie müssen nur so wenige separate Anforderungen wie möglich an die Datenbank senden (Hinweis: Sie können mehr als eine Abfrage in einer einzelnen SQL-Zeichenfolge senden und DataReader.NextResult()
verschiedene Tabellen in a verwenden oder überprüfen DataSet
, um zwischen ihnen zu wechseln).
Mit anderen Worten, anstatt zu überlegen, ob eine Verbindung für eine Anwendung oder eine HTTP-Anforderung oder eine Verbindung pro Abfrage erneut verwendet werden soll, sollten Sie bei jedem Aufruf der Datenbank ... für jeden Roundtrip eine Verbindung angeben. Versuchen Sie dann, die Anzahl der Verbindungen zu minimieren, indem Sie die Anzahl dieser Trips minimieren. Auf diese Weise können Sie beide Ziele erreichen.
Das ist aber nur eine Art von Optimierung. Außerdem wird die Programmierzeit optimiert und eine effektive Wiederverwendung des Codes erreicht. Entwickler möchten nicht immer wieder denselben Code schreiben, um ein offenes und einsatzbereites Verbindungsobjekt zu erhalten. Es ist nicht nur mühsam, sondern auch eine Möglichkeit, Fehler in ein Programm einzufügen.
Auch hier ist es im Allgemeinen besser, eine Verbindung pro Abfrage (oder Roundtrip) zu haben. Sie können auch andere Muster verwenden, um zu vermeiden, dass derselbe Kesselschildcode erneut geschrieben wird. Hier ist ein Beispiel, das ich mag, aber es gibt viele andere.