2009-03-03 3 views
4

Ich habe gefragt Singletonmuster implementiert DAL zu verwenden, aber ich denke, seine schwer, die Verbindungen zu bündeln, verwenden transactions..etcVor- und Nachteile der Verwendung des Singleton-Musters in DAL

ich die Vor- und Nachteile wissen möchten Außerdem möchte ich die beste Möglichkeit kennen, die Verbindungen zu bündeln, da mehr als 500 gleichzeitige Benutzer für die von mir entwickelte Site vorhanden sein können.

DB Server ist Oracle 10g.

DAL verwendet Enterprise Library 3.1

Antwort

3

Das Singleton-Muster eignet sich hervorragend für eine DAL - ich benutze dies in meiner eigenen Enterprise-Web-Anwendung (Hunderte von Benutzern und über 2.000 Methoden in 20-Singleton-Klassen). Das Verbindungs-Pooling wird in der Tat am besten von ado.net und dem SQL-Server selbst gehandhabt. Wenn Sie mehrere Arten von Back-End-Servern haben möchten, ist das kein Problem. Selbst mit einem Singleton-Muster möchten Sie wahrscheinlich eine zentralisierte Datenzugriffsklasse, die die Besonderheiten der direkten Aufrufe der Datenbank behandelt (Parameter, Text-/Prozedurnamen, Anmeldeinformationen/Verbindungszeichenfolge werden alle übergeben).

In meiner Situation entspricht jede Methode auf einem einzigen 1: 1 mit einer gespeicherten Prozedur in meiner Datenbank. Dies macht im Wesentlichen einen C# -Front-End-Hook für jede gespeicherte Prozedur, so dass sie syntaktisch gesprochen fast wie nativer C# -Code aufgerufen werden können. Es macht Anrufe an die DAL sehr einfach. Ich habe mehrere Singletons wegen der großen Anzahl von SPs in Frage. Jeder SP hat ein Präfix wie Development_ oder Financial_ oder Organization_ oder was auch immer. Dann habe ich eine Singleton-Klasse, die jedem entspricht, wie Entwicklung, Finanzen oder Organisation. Also wäre das sp Organization_ViewData in C# eine Methode namens ViewData in einer Singleton-Klasse namens Organization.

Das ist natürlich nur eine Möglichkeit, aber ich habe festgestellt, dass es in den letzten sechs Jahren sehr gut mit mehreren Entwicklern und einer großen Menge Code funktioniert hat. Hauptsache, Konsistenz ist der Schlüssel. Wenn ein Front-End-Programmierer den Namen einer Methode auf einem Ihrer Singleton-Broker betrachtet, sollte er ihnen genau sagen, wo er in das Datenbankende geht. Wenn es ein Problem gibt oder wenn jemand Code durchforschen muss, um zu versuchen, es zu verstehen, müssen weniger Nachverfolgungen durchgeführt werden.

0

Ich weiß nicht, über DAL aber das Singletonmuster ist eine gute Möglichkeit, Daten global zu machen, während eine gute Kapselung zu halten.

0

Mit einem Singleton für die Datenbankverbindung Fabrik in der DAL ist ziemlich üblich. Sie können verschiedene Implementierungen der Fabrik leichter anschließen, ohne viel Code zu ändern. Viele Leute scheinen das Singleton-Muster nicht zu mögen, aber ich denke, es funktioniert in Ordnung für diese Art von Sache.

1

Die beste Vorgehensweise beim Verbindungs-Pooling besteht darin, es nicht selbst zu implementieren, sondern das ADO.NET-Framework dafür sorgen zu lassen.

Sie können Verbindungspooling-Optionen als Parameter innerhalb der Verbindungszeichenfolge festlegen. Dann wird jede Verbindung, die mit dieser Zeichenfolge geöffnet wird, aus dem Verbindungspool bereitgestellt, der vom Framework implementiert und verwaltet wird. Wenn Sie OracleConnection schließen oder entsorgen, wird die zugrunde liegende Verbindung nicht zerstört, sondern stattdessen in den Pool zurückversetzt.

Dies ist hier beschrieben: http://msdn.microsoft.com/en-us/library/ms254502.aspx

über die Verwendung von Singletons im Allgemeinen: ich sie verwendet habe, die Datenzugriffsschicht zu wickeln, und es immer gut funktioniert hat.

Beachten Sie, dass Transaktionen nur für bestimmte Verbindungen gelten, nicht für die Datenbank als Ganzes. Dies bedeutet, dass mehrere Threads ausgeführt werden können und dass jeder Thread über unabhängige Transaktionen in die Datenbank lesen und schreiben kann, wobei jeder Thread eine separate OracleConnection-Instanz verwendet.

+0

Wie haben Sie Transaktionen mit Singleton-Muster verwaltet? – Novice

+0

Ich habe einen weiteren Absatz hinzugefügt, um über Transaktionen zu sprechen. –

+0

Wenn jedoch ein einzelnes DAL-Objekt über die Anwendungen verteilt ist, können wir den Verbindungspool von ADO.net verwenden, da dieses einzelne DAL-Objekt immer nur eine Verbindung benötigt. – Novice

0

Ich glaube nicht, dass Sie Leistungsunterschiede haben werden, wenn Sie einen Singleton verwenden oder nicht, weil Sie immer noch mehrere Threads gleichzeitig auf derselben Methode ausführen können. Wenn Sie darauf achten, keine internen Felder zu haben, die in allen Threads geteilt werden, funktioniert alles gut.

Am Ende muss die Klasse, die den Verbindungspool verwaltet, Thread-sicher sein, und Sie werden am Ende ein paar Sperren machen, die die Leistung beeinträchtigen könnten, aber sie werden alle benötigt. (es ist intern im Rahmen gemacht, und Sie können sein Verhalten sowieso nicht ändern)

Wenn Sie sich entscheiden, kein Singleton zu verwenden, stellen Sie sicher, dass Ihre DAL-Instanzen leicht sind, da dies einen Unterschied machen kann, aber normalerweise nicht .

Hinweis: Wenn Sie über die Verbindungspools sprechen, müssen Sie nur darauf achten, dass Sie dem Muster "spät öffnen, früh schließen" folgen. Das heißt, verzögern Sie das Öffnen der Verbindung so weit wie möglich und schließen Sie es so schnell wie möglich, nachdem Sie alles getan haben, was Sie brauchen.

Nachdem das gesamte System mit dieser Zauberregel erstellt wurde, können Sie mit den Verbindungszeichenfolgenparametern spielen, um einige Pooloptionen (Anfangsgröße, Maximalgröße, ...) zu ändern.)

0

Ich bin ein bisschen unruhig über die Verwendung von Singletons im Fall einer DAL. Was ist, wenn ich mehr als ein Datenbank-Backend verwenden möchte? Vielleicht möchte ich MsSQL für Rechnungen verwenden, aber Active Directory für die Authentifizierung. Oder vielleicht möchte ich MySQL für Forumsbeiträge verwenden, aber PostgreSQL für Geo-Clustering (realistischer für mich, heh). Singleton-Interfaces machen das Testen der Datenbank-Layer möglicherweise schwieriger, wenn ich keine Pseudo-Datenbankverbindung zum Test bestehen kann.

Verwandte Themen