Frage

Ich habe gefragt Singletonmuster implementiert DAL zu verwenden, aber ich denke, seine schwer, die Verbindungen zu bündeln, verwenden transactions..etc

Ich möchte die Vor- und Nachteile kennen und auch die beste Art und Weise wissen möchten, die Verbindungen zu bündeln, da es mehr als 500 gleichzeitige Benutzer für den Standort sein kann ich entwickeln werde.

DB-Server ist Oracle 10g.

DAL verwendet Enterprise Library 3.1

War es hilfreich?

Lösung

Das Singletonmuster für eine DAL groß ist - ich dies in meiner eigenen Enterprise-Web-Anwendung (Hunderte von Benutzern und mehr als 2000 Methoden in 20-einige Singleton-Klassen). Das Connection-Pooling ist in der Tat am besten durch ado.net und der SQL-Server selbst behandelt. Wenn Sie mehrere Arten von Back-End-Server haben wollen, sind, ist das kein Problem. Selbst mit einem Singletonmuster, möchten Sie wahrscheinlich eine zentrale Datenzugriffsklasse, die die Besonderheiten der tatsächlich machen direkte Anrufe auf die Datenbank (mit Parametern, Text / Prozedurnamen, Berechtigungsnachweise / Verbindungszeichenfolge alle bestanden in) behandelt.

In meiner Situation, jede Methode auf einem einzelnen entsprechen 1: 1 mit einer gespeicherten Prozedur in der Datenbank. Dies macht im Wesentlichen einen C # „Front End“ Haken für jedes Verfahren gespeichert, so dass sie fast wie native C # -Code bezeichnet werden kann, syntaktisch zu sprechen. Es macht Anrufe auf die DAL sehr einfach. Ich habe mehrere Singletons aufgrund der massiven Anzahl von SPs in Frage. Jeder SP hat einen Präfix, wie Development_ oder Financial_ oder ORGANIZATION_ oder was auch immer. Dann habe ich eine Singleton-Klasse, die jedem entspricht, wie Entwicklung, Finanz-, oder Organisation. So ist die sp Organization_ViewData würde in C # eine Methode namens Viewdata auf einem Singletonklasse namens Organisation.

Das ist nur eine Möglichkeit, es zu tun, natürlich, aber ich habe das sehr gut mit mehreren Entwicklern und eine großen Menge an Code in den letzten sechs Jahren Arbeit gefunden. Die Hauptsache ist, dass die Konsistenz ist der Schlüssel. Wenn ein Front-End-Programmierer an dem Namen einer Methode auf einem Ihrer Singleton Makler suchen, das sollte ihnen genau sagen, wo es in die Datenbank Ende geht. Auf diese Weise, wenn es ein Problem gibt, oder wenn jemand durch den Code zu suchen, hat das, um zu versuchen, es zu verstehen, gibt es weniger Verfolgung, die getan werden muss.

Andere Tipps

Die beste Vorgehensweise für Verbindungspooling ist es selbst nicht umsetzen, sondern der ADO.NET Rahmen darum kümmern lassen.

Sie können Verbindungs-Pooling-Optionen als Parameter in der Verbindungszeichenfolge festgelegt. jede Verbindung dann, die mit dieser Zeichenfolge eröffnet wird, wird aus dem Verbindungspool zugeführt werden, die durch das Framework implementiert und verwaltet wird. Wenn Sie schließen oder entsorgen Sie das OracleConnection wird die zugrunde liegende Verbindung nicht zerstört, sondern stattdessen auf den Pool zurück.

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

Über die Verwendung von Singletons im Allgemeinen. Ich habe verwendet sie die Datenzugriffsschicht zu umhüllen, und es hat immer gut funktioniert

Beachten Sie, dass Transaktionen nur auf bestimmte Verbindungen anwenden, nicht die Datenbank als Ganzes. Dies bedeutet, dass Sie mehrere Threads ausgeführt haben können, und jeder Thread kann auf die Datenbank durch unabhängige Transaktionen lesen und schreiben, jeden Thread Bereitstellen eine separate OracleConnection Instanz verwendet.

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

einen Singleton für die Datenbankverbindung Fabrik in den DAL

Unter Verwendung ist sehr verbreitet. Damit können Sie leichter in verschiedenen Implementierungen der Fabrik stecken, ohne viel Code zu ändern. Viele Leute scheinen nicht die Singletonmuster zu mögen, aber ich denke, es ist für diese Art der Sache in Ordnung funktioniert.

Ich bin ein bisschen beunruhigt über Singletons im Fall eines DAL verwenden. Was passiert, wenn ich mehr als eine Datenbank-Backend verwendet werden soll. Vielleicht möchte ich MsSQL für Rechnungen aber Active Directory für die Authentifizierung verwenden. Oder vielleicht möchte ich MySQL verwenden für Forum-Beiträge, aber PostgreSQL für Geo-Clustering (realistischer für mich, heh). Singleton Schnittstellen kann die Datenbankschichten machen Testen viel schwieriger, wenn ich nicht eine Mock-Datenbank-Verbindung zum Test bestehen kann.

Ich glaube nicht, Sie werden die Leistungsunterschiede haben, wenn Sie einen Singleton verwenden oder nicht, weil Sie immer noch mehrere Threads auf demselben Verfahren zur gleichen Zeit haben. Wenn Sie kümmern sich um keine internen Felder aufweist, die in allen Threads freigegeben werden, wird alles gut.

Am Ende der Klasse, die den Verbindungspool verwaltet braucht Thread sicher zu sein, und Sie werden ein paar Schleusen am Ende macht, die die Leistung beeinträchtigen können, aber sie sind alle notwendig. (Es ist intern im Rahmen gemacht, und Sie können nicht ändern, es ist Verhalten sowieso)

Wenn Sie sich entscheiden, nicht einen Singleton verwenden, sicher sein, dass Ihre DAL Instanzen leichtgewichtige, weil dies könnte einen Unterschied machen, aber in der Regel ist es nicht.

Hinweis: Gespräch über die Verbindungspools, die einzige wichtige Sache, Sie kümmern sich um im Anschluss an die „spät abends geöffnet, in der Nähe früh“ Muster nehmen müssen. Das heißt, verzögern die offen die Verbindung so weit wie möglich, und schließen Sie es so schnell wie möglich, nachdem Sie alles getan, was Sie mit ihm brauchen.

Nachdem alle das System mit dieser magischen Regel gebaut, können Sie mit den Verbindungs-String-Parametern spielen einige Pool-Optionen zu ändern (Anfangsgröße, maximale Größe, ...)

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