Momentan erstelle ich eine Datenbankverbindung, wenn meine Webseite zum ersten Mal geladen wird. Ich verarbeite dann die Seite und führe alle Abfragen für diese Verbindung aus. Ist dies die beste Methode, oder sollte bei jeder Abfrage eine Datenbankverbindung hergestellt werden?
ps Es ist für mich sinnvoller, eine Verbindung zu erstellen und zu verwenden, aber ich weiß nicht, ob dies andere Probleme verursachen kann.
Ich verwende C # (ASP.NET) mit MSSQL.
quelle
Es wird empfohlen, eine Verbindung pro Abfrage zu erstellen. Bei der Anzeige von Daten werden alle erforderlichen Daten auf einmal von der Abfrage übernommen .
Hintergrundinformation:
In .NET wird beim Aufrufen
SqlConnection.Open()
standardmäßig immer das Verbindungspooling transparent verwendet (siehe "Verwenden des Verbindungspoolings mit SQL Server" auf MSDN). Sie können also einfach eine neue Verbindung mit greifenOpen()
und anrufen,Close()
wenn Sie fertig sind, und .NET wird das Richtige tun.Beachten Sie, dass ohne Verbindungspooling eine Verbindung pro Abfrage eine sehr schlechte Idee wäre, da das Erstellen von realen Datenbankverbindungen sehr kostspielig sein kann (Authentifizierung, Netzwerk-Overhead usw.) und die Anzahl der gleichzeitig geöffneten Verbindungen in der Regel sehr begrenzt ist.
quelle
SqlConnection.Open()
immer transparentes Verbindungspooling verwendet. Der Unterschied zwischen "Verbindung öffnen" und "Verbindung aus einem Pool starten" besteht also nicht. Mein Missverständnis. Ich habe mir erlaubt, eine kleine Erklärung zu der Frage zu redigieren, und die Abstimmung zurückgenommen.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üfenDataSet
, 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.
quelle