Frage

Im derzeit ein Webportal mit ASP.NET zu schaffen, die sich stark auf die Datenbanknutzung beruht. Grundsätzlich ist jede (auch fast alle: P). GET-Abfrage von jedem Benutzer in einer Anfrage an die Datenbank von dem Webserver führt

Nun, ich bin auf diese wirklich neu, und ich bin sehr besorgt über die Leistung. Aufgrund meines Mangels an Erfahrung in diesem Bereich, weiß ich wirklich nicht, was zu erwarten ist.

Meine Frage ist, ADO.NET verwenden, sei es eine bessere Wahl sein, nur eine statische Verbindung vom Webserver auf die Datenbank, und dann überprüfen Sie die integrety dieser Verbindung serverseitig vor jeder Abfrage an die Datenbank offen zu lassen? - Oder würde ich die Verbindung vor jeder Abfrage besser dran zu öffnen und es dann später schließen

In meinem Kopf die erste Option wäre das besser, als Sie Zeit sparen Handshaking usw. vor jeder Abfrage und Sie Speicher speichern sowohl auf der Datenbank und der Serverseite, da Sie nur eine Verbindung haben, aber gibt es Übertretungen zu diesem Ansatz ? Könnte 2 Abfragen möglicherweise zerstören die zurück-Datensatz jede andere Integrität bei gleichzeitig senden oder mischen?

Ich habe überall in hier und im Internet versucht, die Suche einig Best Practices, um dies zu finden, aber ohne Glück. Closest ich erhielt, war dieses: ist es sicher zu halte Datenbankverbindungen offen für lange Zeit , aber das scheint passender für verteilte Systeme zu sein, wo Sie mehr als einen Benutzer der Datenbank haben, während ich nur meinen Webserver ..

War es hilfreich?

Lösung

Du bist viel früh, um Leistung zu sorgen.

Wie auch immer, Verbindungen werden vom Rahmen gebündelt. Sie sollten sie mit ihnen, und der Entsorgung von ihnen so schnell wie möglich eröffnen.

So etwas wie ...

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

Andere Tipps

Es ist besser, ADO.NET das Connection-Pooling behandeln zu lassen. Es wird die Verbindung bestehen bleiben, wenn sie es braucht, um denkt, aber keine statische Verbindung Objekt verwenden. Das nur riecht. Es wäre besser, das Verbindungsobjekt laufen um zu Methoden, die es brauchen, und die Verbindung in einem using Block erstellen.

Sie sollten immer schließen Sie die Verbindung nach der DB Interaktion beenden. ADO.NET hat Connection Pooling, die sich um eine effiziente Verbindung Wiederverwendung statt. Jedes Mal, wenn Sie 2. öffnen, 3. und nachfolgende Verbindungen -. Sie werden fast ohne Overhead aus einem Pool genommen werden

Hope, das hilft.

würde ich mehr über Caching als erweiterte Connection Pooling denken. Jede get benötigt eine Datenbank Hit?

Wenn ihr ein Portal Sie haben gemeinsame Inhalte und Benutzer bestimmte Inhalte, die Cache verwenden Sie gemeinsame Elemente sowie mit einem verstümmelten Schlüssel speichern kann (mit der Benutzer-ID) Sie bestimmte Elemente Benutzer speichern kann.

ADO.NET tut Connection Pooling. Wenn Sie die Verbindung schließen Anruf-Objekt wird die Verbindung im Pool halten wird die nächste Verbindung viel schneller zu machen.

Ihre erste Vermutung ist richtig. Was Sie brauchen, ist Datenbank Connection Pooling.

Sie definitiv nicht wollen, um eine Verbindung für jeden Datenbank-Aufruf zu öffnen, die sehr schnell in extrem schlechter Leistung führen. Zur Errichtung einer Datenbank verbindet, ist sehr teuer.

Stattdessen, was Sie sollten verwenden eine Verbindung Pool. Der Pool wird Ihre Verbindungen verwalten und versuchen, bestehende Verbindungen wiederverwendet werden, wenn möglich.

Ich weiß nicht, Ihre Plattform, aber schauen Sie in Connection Pooling - es gibt eine Bibliothek oder ein Dienstprogramm zur Verfügung stehen muss (entweder im Basissystem oder als Add-on, oder mit den Datenbanktreiber im Lieferumfang enthalten), dass die Mittel zur Verfügung stellen wird mehr aktive Verbindungen zur Datenbank zu bündeln, die bereit sind, und die Startlöcher verwendet werden, wenn Sie einen aus dem Pool erhalten.

Um ehrlich zu sein, würde ich die Zusammenlegung erwartet standardmäßig in jeder Datenbank-Abstraktionsbibliothek (mit einer verfügbaren Option zu deaktivieren) auftritt. Es scheint, dass ADO.NET dies der Fall ist.

Wirklich die erste Frage ist Warum Sie sind sehr besorgt über die Leistung? Was ist Ihre erwartete Arbeitsbelastung? Haben Sie es schon versucht?

Aber im Allgemeinen, ja, es ist klüger eine offene Verbindung zu haben, dass Sie halten uns für eine Weile als wieder zu öffnen, eine Datenbank-Verbindung jedes Mal; in Abhängigkeit von der Art der Verbindung, von Netzwerkproblemen, und die Phase des Monds, kann es einen guten Teil einer Sekunde oder mehr, um eine anfängliche Verbindung dauern; wenn Ihre Arbeit ist, so dass Sie erwarten mehr als eine GET alle fünf Sekunden oder so, werden Sie glücklicher mit einer stehenden Verbindung sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top