2009-03-04 9 views
3

Ich erstelle derzeit ein Webportal mit ASP.NET, das stark von der Datenbanknutzung abhängt. Grundsätzlich führt jede (GET fast jede: P) GET-Abfrage von jedem Benutzer zu einer Abfrage der Datenbank vom Webserver.Datenbankverbindung einmal oder bei jeder Datenbankaktion öffnen?

Jetzt bin ich wirklich neu, und ich bin sehr besorgt über die Leistung. Aufgrund meiner mangelnden Erfahrung in diesem Bereich weiß ich nicht wirklich, was ich zu erwarten habe.

Meine Frage ist, mit ADO.NET, wäre es eine klügere Wahl, nur eine statische Verbindung vom Webserver zur Datenbank offen zu lassen, und dann überprüfen Sie die Integrität dieser Verbindung Server vor jeder Abfrage an die Datenbank? - Oder wäre es besser, wenn ich die Verbindung vor jeder Abfrage öffne und anschließend wieder schließe?

In meinem Kopf wäre die erste Option die bessere, wie Sie Zeit Handshaking usw. vor jeder Abfrage sparen und Sie sparen Speicher sowohl auf der Datenbank als auch auf der Serverseite, da Sie nur eine Verbindung haben, aber gibt es irgendwelche Stürze zu diesem Ansatz? Könnten 2 Abfragen gleichzeitig die gegenseitige Integrität zerstören oder den zurückgegebenen Datensatz mischen?

Ich habe versucht, überall in hier und im Internet zu suchen, um einige Best-Practices darüber zu finden, aber ohne Glück. Am nächsten kam ich: is it safe to keep database connections open for long time, aber das scheint passender für verteilte Systeme, wo Sie mehr als einen Benutzer der Datenbank haben, während ich nur meinen Webserver bekam.

Antwort

8

Sie sind zu früh, um sich Sorgen über die Leistung zu machen.

Jedenfalls werden Verbindungen durch das Framework zusammengefasst. Sie sollten sie öffnen, sie benutzen und sie so schnell wie möglich entsorgen. wie

Etwas ...

public object Load() 
{ 
    using (SqlConnection cn = new SqlConnection(connectionString)) 
    using (SqlCommand cm = new SqlCommand(commandString, cn)) 
    { 
    cn.Open(); 
    return cm.ExecuteScalar(); 
    } 
} 
3

Es ist besser, ADO.NET handhaben lassen Verbindungspooling. Die Verbindung bleibt erhalten, wenn sie es für notwendig hält, aber kein statisches Verbindungsobjekt verwendet. Das riecht einfach. Es wäre besser, das Verbindungsobjekt an Methoden zu übergeben, die es benötigen, und die Verbindung in einem using-Block zu erstellen.

1

Sie immer Ihre Verbindung nach Beendigung Ihrer DB Interaktion schließen sollte. ADO.NET verfügt über ein Verbindungspooling, das für eine effiziente Wiederverwendung von Verbindungen sorgt. Wann immer Sie die zweite, dritte und nachfolgende Verbindung öffnen, werden sie fast ohne Overhead aus einem Pool genommen.

Hoffe, das hilft.

0

ADO.NET führt Verbindungspooling durch. Wenn Sie das Verbindungsobjekt schließen, wird die Verbindung im Pool beibehalten, wodurch die nächste Verbindung viel schneller wird.

0

Sie wollen auf jeden Fall keine Verbindung für jeden Datenbankaufruf öffnen, was sehr schnell zu einer sehr schlechten Leistung führt. Die Einrichtung einer Datenbankverbindung ist sehr teuer.

Stattdessen sollten Sie einen Verbindungspool verwenden. Der Pool verwaltet Ihre Verbindungen und versucht, bestehende Verbindungen nach Möglichkeit wiederzuverwenden.

+0

Das hört sich so an, als sollte er es alleine machen. Aber ADO.Net sollte seine Aufgabe am besten erfüllen. – BendEg

0

Ich kenne Ihre Plattform nicht, aber schauen Sie in Connection Pooling - es muss eine Bibliothek oder ein Dienstprogramm zur Verfügung stehen (entweder im Basissystem oder als Add-on oder mit den Datenbanktreibern geliefert)), die die Möglichkeit bietet, mehrere aktive Verbindungen zur Datenbank zu bündeln, die bereit und einsatzbereit sind, wenn Sie eine aus dem Pool erhalten.

Um ehrlich zu sein, würde ich erwarten, dass das Pooling standardmäßig in jeder Datenbankabstraktionsbibliothek (mit einer verfügbaren Option, um es zu deaktivieren) auftreten. Es scheint, dass ADO.NET dies tut.

-2

Wirklich die erste Frage ist warum sind Sie sehr besorgt über die Leistung? Wie hoch ist Ihre erwartete Arbeitsbelastung? Hast du es schon probiert?

Aber im Allgemeinen, ja, es ist schlauer, eine offene Verbindung zu haben, die Sie für eine Weile behalten, als jedes Mal eine Datenbankverbindung wieder zu öffnen; Abhängig von der Art der Verbindung, Netzwerkproblemen und der Phase des Mondes, kann es einen guten Teil einer Sekunde oder mehr dauern, eine erste Verbindung herzustellen; Wenn Ihre Arbeitslast so hoch ist, dass Sie alle fünf Sekunden mehr als ein GET erwarten, sind Sie mit einer ständigen Verbindung zufriedener.

+0

Das Verbindungspooling macht viel bessere Arbeit. Wenn Sie eine stehende Verbindung haben, wird das sein: Pro Kunde? Pro Gewinde? Pro Anwendung? "Meine erste asp.net App" hielt eine Verbindung offen und gab sie weiter. Zu Open wechseln, Sachen machen, geschlossen, hat Stunden an App-Zeit eingespart. –

+0

Und was habe ich gesagt, dass das nicht stimmt? –

+0

"Ja, es ist schlauer, eine offene Verbindung zu haben, die Sie für eine Weile behalten, als eine Datenbankverbindung jedes Mal neu zu öffnen" - Ich habe Sie nicht abgemeldet, aber das ist nicht die beste Vorgehensweise für ADO.NET Worum geht es in der Frage? – Will

1

Ich würde mehr über Zwischenspeicherung als erweiterte Verbindungspooling denken. Jedes get erfordert einen Datenbanktreffer?

Wenn es ein Portal ist, haben Sie gemeinsame Inhalte und benutzerspezifische Inhalte, mit dem Cache können Sie allgemeine Elemente sowie mit einem entstellten Schlüssel (mit der Benutzer-ID) können Sie benutzerspezifische Elemente speichern.

+0

Caching wird prolly meine nächste Sorge .. Check-in auf SO in ein paar Wochen xD – cwap

+0

Ich habe vergessen, darauf hinzuweisen, dass das Caching eine bessere Alternative zum Mischen mit dem Verbindungsobjekt ist. +1. – Will