Gibt es einen Grund dafür, dass ein Objektpool nicht als Singleton behandelt wird?

8

Ich meine nicht unbedingt, dass ich das Singleton-Muster implementiert habe, sondern nur eine Instanz eines Pools. Ich mag die Idee nicht, nur einen Pool zu haben (oder einen pro gepoolten Typ). Ich kann jedoch keine konkreten Situationen finden, in denen mehrere Pools für veränderbare Typen vorteilhaft sind, zumindest nicht dort, wo ein einzelner Pool genauso gut funktionieren kann.

Welche Vorteile gibt es, mehrere Pools über einen Singleton-Pool zu haben?

    
Chris Charabaruk 09.02.2011, 19:24
quelle

3 Antworten

2
  

Welche Vorteile haben Sie?   mehrere Pools über einen Singleton-Pool?

Ich nehme an, die meisten Objektpools, die wir verwenden, wie der ThreadPool, werden der Einfachheit halber als Singletons implementiert: Die Entwickler dieser Pools sahen in Pools mit mehreren Instanzen keinen Sinn.

Es gibt jedoch eine Handvoll Orte, an denen wir wirklich mehrere Pools haben: IIS-Anwendungspools und Datenbankverbindungspools.

App-Pools

In IIS können Sie mehrere Anwendungspools konfigurieren, sodass alle verwandten Webanwendungen in ihrem eigenen Pool ausgeführt werden. Dieses Design bietet einige Vorteile, und die Vorteile können sich auf Pool-Implementierungen außerhalb von IIS verallgemeinern:

  • Mehrere Objektpools ermöglichen ein gewisses Maß an Isolation, sodass ein Fehler in einem Pool sich nicht auf Objekte in anderen Pools auswirken sollte.

  • Jeder Pool kann unter einem anderen Benutzer ausgeführt werden. Dies gibt Ihnen verschiedene Sicherheitsebenen basierend auf Ihrem Anwendungspool.

  • Jeder Pool kann einen anderen Handler für Fehler haben.

  • Jeder Pool kann mit einer anderen Version von .NET Framework ausgeführt werden.

  • Jeder Pool kann sein eigenes HTTP-Timeout haben.

Verbindungspools

In SQL Server verwenden mehrere Aufrufe an eine Datenbank Verbindungspooling, um den Aufwand beim Erstellen einer neuen Datenbankverbindung für jede Abfrage zu vermeiden, jedoch SQL Server erstellt einen neuen Pool pro Verbindungszeichenfolge . Ich stelle mir vor, dass der Grund für dieses Design folgender ist:

  • Jeder Pool enthält eine Verbindung zu einer bestimmten Datenbankinstanz. Wenn nur ein Pool alle Verbindungen enthält, müssen alle Verbindungen durchsucht werden, bis die Verbindung mit der Verbindungszeichenfolge gefunden wird, die Sie angefordert haben. Da pro Verbindungszeichenfolge mehrere Pools vorhanden sind, ist es einfacher, die erste verfügbare Verbindung aus diesem bestimmten Pool abzurufen, ohne andere Verbindungen zu durchsuchen.

  • Mit anderen Worten, ich vermute, SQL Server verwendet mehrere Verbindungspools als Optimierung, um schnell eine Datenbankverbindung zu erhalten.

  • Ich kann mir auch vorstellen, dass all diese Verbindungen wahrscheinlich einige Ressourcen teilen, die für ihren Verbindungspool spezifisch sind, was mit einem einzelnen Pool nicht möglich ist. Sie können beispielsweise die maximale Größe des Verbindungspools pro Verbindungszeichenfolge angeben. Sie können die Anzahl der gleichzeitigen Verbindungen zu einer bestimmten Datenbank unter Verwendung eines Single-Pool-Entwurfs möglicherweise nicht steuern.

So erstellen Sie einen Pool

Sie können nicht wirklich wählen, ob Sie mehrere Pools oder einen einzelnen Pool haben möchten, ohne sich zu überlegen, was Sie wirklich von Ihrem Design benötigen.

Wenn Sie einen sehr einfachen Objekt-Pool haben, können Sie vielleicht mit einem Singleton-Design davonkommen. Wenn Sie wirklich zusätzliche Flexibilität, Anpassung oder vielleicht ein wirklich einzigartiges Setup wie einen Objektpool benötigen, der auf mehrere Prozesse oder Maschinen verteilt ist, würden Sie definitiv von einem n-gleton-Design profitieren.

    
Juliet 09.02.2011, 22:55
quelle
3

Ja, es gibt definitiv potentielle Gründe dafür, mehrere Objektpools zu haben - insbesondere können Sie zulassen, dass ein Pool für die Garbage-Collection geeignet wird (oder diese manuell freigibt), während andere beibehalten werden.

Betrachten Sie zum Beispiel einen Objektpool für Zeichenfolgen. Das ist im Kontext von XML sehr hilfreich - wenn Sie mehrere XML-Dokumente desselben Schemas analysieren, möchten Sie möglicherweise die für die Element- und Attributnamen verwendeten Zeichenfolgen zusammenfassen. Sobald Sie diesen Teil der Verarbeitung jedoch abgeschlossen haben, werden diese Namen möglicherweise nie wieder verwendet. Wenn Sie also auf einen anderen Satz von Dokumenten wechseln, möchten Sie möglicherweise einen anderen Pool verwenden. Sie können beide Aufgaben gleichzeitig erledigen. In diesem Fall ist es sinnvoll, beide Pools gleichzeitig verfügbar zu haben.

Oder betrachten Sie Thread-Pools - ich betrachte es als Nachteil der .NET-Thread-Pool-Implementierung, dass es im Grunde nur einen System-Thread-Pool gibt. Ich mag die Idee, mehrere Thread-Pools in einem Server zu haben - einige Threads für Batch-Jobs niedriger Priorität, einige für "normale" Anfragen und einige Threads mit hoher Priorität für Jobs wie Health Monitoring.

    
Jon Skeet 09.02.2011 19:28
quelle
0

Wenn Sie ein Singleton-Muster sorgfältig implementieren, können Sie Ihre Meinung später ändern. Verkapseln Sie einfach die Singletonity Ihrer Klasse hinter einer Factory-Methode. Wenn alles das verwendet, können Sie später mehrere Instanzen zulassen, wenn Sie einen guten Grund haben.

%Vor%     
tallseth 13.02.2011 15:21
quelle