2 Stimmen

Verwenden Sie Linq-To-Sql wirklich so?

Ich habe hier einen interessanten Link über Linq-To-Sql gesehen: Effizienterer Datenbankzugriff

Wenn ich mir meinen eigenen Code ansehe, stelle ich fest, dass ich auch nicht die DataClassesDataContext . Ist das ein Problem? Ich weiß es nicht, aber ich habe meinen Code durchsucht und Folgendes hinzugefügt using (DataClassesDataContext db = new DataClassesDataContext()) in meinem gesamten Code.

Und jetzt kommt das Interessante. Wir protokollieren fast jeden Seitenzugriff und jede Transaktion in unserem Code. Ich habe jetzt also einen Codeblock, der so aussieht:

protected WriteLog(String activity)
{
   using (DataClassesDataContext db = new DataClassesDataContext())
   {
       ... Do db write with Linq
   }
}

Diese Funktion wird mit mindestens 50 Aufrufen pro Sekunde sehr stark genutzt. Ich gehe also davon aus, dass wir früher unter potenziellen "Lecks" gelitten haben, was ein Problem darstellt. Aber jetzt sieht es so aus, als würden wir keine DB-Ressourcen vergeuden, sondern stattdessen viel Zeit mit dem Öffnen und Schließen von Datenbankverbindungen verbringen. Das kann doch nicht richtig sein, oder? Öffnet und schließt der obige Code jetzt eine DB-Verbindung? für jeden einzelnen Protokolleintrag unserer Nutzer und damit noch mehr Overhead verursachen, als den DataClassesDataContext zu einem späteren Zeitpunkt in die Müllabfuhr zu geben?

5voto

Adam Robinson Punkte 176996

Ihre Frage hat eine falsche Prämisse: Sie gehen davon aus, dass Sie die Verbindung für andere Benutzer offen lassen, wenn Sie den Kontext nicht auflösen. Das ist falsch. Alles, was Sie tun, ist das Aufschieben der Schließen der Verbindung bis zur Garbage Collection; nachfolgende Anfragen werden immer eine neue Verbindung öffnen, wenn sie den Kontext instanziieren.

Abgesehen davon ist die Kontextklasse leichtgewichtig (wie auch die Datenbankverbindungsobjekte). Ihre Verbindungen werden automatisch gepoolt, so dass es nicht unbedingt ein 1:1-Verhältnis zwischen Datenbankverbindungsobjekten und tatsächlichen Datenbankverbindungen gibt.

Indem Sie die Klasse ordnungsgemäß entsorgen, indem Sie sie in einen using-Block einschließen, verwenden Sie sie nun korrekt (kein Wortspiel beabsichtigt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X