Ich habe meine Geschäftslogik in einfachen statischen Klassen mit statischen Methoden implementiert. Jede dieser Methoden öffnet / schließt die SQL-Verbindung, wenn sie aufgerufen wird:
public static void DoSomething(string something)
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
Ich denke jedoch, dass das Vermeiden des Öffnens und Schließens einer Verbindung die Leistung spart . Ich habe vor einiger Zeit einige Tests mit der OleDbConnection- Klasse durchgeführt ( ich bin mir bei SqlConnection nicht sicher), und es hat definitiv geholfen, so zu funktionieren (soweit ich mich erinnere):
//pass the connection object into the method
public static void DoSomething(string something, SqlConnection connection)
{
bool openConn = (connection.State == ConnectionState.Open);
if (!openConn)
{
connection.Open();
}
// ....
if (openConn)
{
connection.Close();
}
}
Die Frage ist also: Soll ich die Methode (a) oder die Methode (b) wählen? Ich habe in einer anderen Frage zum Stackoverflow gelesen, dass das Verbindungspooling die Leistung für mich gespart hat. Ich muss mich überhaupt nicht darum kümmern ...
PS. Es ist eine ASP.NET-App - Verbindungen bestehen nur während einer Webanforderung. Keine Win-App oder Service.
quelle
DbConnection.StateChange
Ereignis, um Änderungen der Statusänderung der Verbindung zu überwachen (und möglicherweise lokal zu speichern), anstatt dieDbConnection.State
Eigenschaft direkt zu überprüfen . Sie sparen Leistungskosten.Antworten:
Halten Sie sich an Option a .
Das Verbindungspooling ist dein Freund.
quelle
Verwenden Sie jedes Mal Methode (a). Wenn Sie mit der Skalierung Ihrer Anwendung beginnen, wird die Logik, die sich mit dem Status befasst, zu einem echten Problem, wenn Sie dies nicht tun.
Connection Pooling macht das, was es verspricht. Denken Sie nur daran, was passiert, wenn die Anwendung skaliert wird und wie schwierig es wäre, den Öffnungs- / Schließstatus der Verbindung manuell zu verwalten. Der Verbindungspool erledigt dies sehr gut automatisch. Wenn Sie sich Sorgen um die Leistung machen, denken Sie an einen Speicher-Cache-Mechanismus, damit nichts blockiert wird.
quelle
Schließen Sie Verbindungen immer, sobald Sie mit ihnen fertig sind, damit die zugrunde liegende Datenbankverbindung wieder in den Pool aufgenommen und für andere Anrufer verfügbar sein kann. Das Verbindungspooling ist ziemlich gut optimiert, daher gibt es dafür keine nennenswerten Nachteile. Der Rat ist im Grunde der gleiche wie bei Transaktionen - halten Sie sie kurz und knapp, wenn Sie fertig sind.
Es wird komplizierter, wenn Sie auf MSDTC-Probleme stoßen, indem Sie eine einzelne Transaktion für Code verwenden, der mehrere Verbindungen verwendet. In diesem Fall müssen Sie das Verbindungsobjekt tatsächlich freigeben und erst schließen, wenn die Transaktion abgeschlossen ist.
Da Sie die Dinge hier jedoch von Hand erledigen, sollten Sie Tools untersuchen, die Verbindungen für Sie verwalten, z. B. DataSets, Linq to SQL, Entity Framework oder NHibernate.
quelle
Haftungsausschluss: Ich weiß, dass dies alt ist, aber ich habe einen einfachen Weg gefunden, diese Tatsache zu demonstrieren, also setze ich meine zwei Cent ein.
Wenn Sie Probleme haben zu glauben, dass das Pooling wirklich schneller sein wird, probieren Sie Folgendes aus:
Fügen Sie irgendwo Folgendes hinzu:
Ersetzen Sie nun alle Aufrufe von
Open()
durchTimedOpen()
und führen Sie Ihr Programm aus. Für jede einzelne Verbindungszeichenfolge, die Sie haben, wird im Konsolenfenster (Ausgabefenster) ein einziges langes Öffnen geöffnet und eine Reihe sehr schneller Fenster geöffnet.Wenn Sie sie kennzeichnen möchten, können Sie
new StackTrace(true).GetFrame(1) +
sie dem Anruf hinzufügenWriteLine
.quelle
Es gibt Unterschiede zwischen physischen und logischen Verbindungen. DbConnection ist eine Art logische Verbindung und verwendet die zugrunde liegende physische Verbindung zu Oracle. Das Schließen / Öffnen von DbConnection wirkt sich nicht auf Ihre Leistung aus, macht Ihren Code jedoch sauber und stabil - Verbindungslecks sind in diesem Fall nicht möglich.
Sie sollten sich auch an Fälle erinnern, in denen es Einschränkungen für parallele Verbindungen auf dem Datenbankserver gibt. Berücksichtigen Sie dies, dass Ihre Verbindungen sehr kurz sein müssen.
Der Verbindungspool befreit Sie von der Überprüfung des Verbindungsstatus - öffnen, verwenden und schließen Sie sie einfach sofort.
quelle
Wenn der Benutzer beispielsweise eine Ladeaktion ausführt, muss Ihre Anwendung zuerst den Kontostand des Benutzers ermitteln und aktualisieren. Er sollte dieselbe Verbindung verwenden.
Selbst wenn ado.net über einen Verbindungspool verfügt, sind die Kosten für den Versand von Verbindungen sehr gering, aber die Wiederverwendung von Verbindungen ist die bessere Wahl.
Da die Verbindung blockiert, wenn Sie eine Abfrage oder einen Befehl ausführen, bedeutet dies, dass Ihre Anwendung gleichzeitig nur eine Datenbankoperation ausführt, wie schlecht die Leistung ist.
Ein weiteres Problem ist, dass Ihre Anwendung immer eine Verbindung hat, obwohl Ihr Benutzer sie nur geöffnet hat, aber keine Vorgänge. Wenn viele Benutzer Ihre Anwendung öffnen, kostet der Datenbankserver in Kürze die gesamte Verbindungsquelle, während Ihre Benutzer dies nicht getan haben etwas.
quelle