2011-01-14 4 views
1

Ich brauche Verbindungen zu einer Ressource. Die tatsächliche Ressource ist für diese Diskussion nicht wichtig. Die Sache ist jedoch, dass diese Verbindungen nicht threadsicher sind, daher ist die Notwendigkeit des Bündelns als Verbinden etc. eine teure Operation.Gibt es Pooling-Lösungen, die es ermöglichen, dass ein Schlüssel an die Übernahme/Take-Methode übergeben wird

Meine ursprüngliche Idee war für einen großen Pool, der das Timing von Verbindungen verwaltet und sie etc. abtötet. Das Problem ist jedoch, dass jede Verbindung einen anderen Parameter enthalten kann. Daher ist es notwendig, den Parameter zu übergeben Der Pooler versucht damit, eine Verbindung mit dem gleichen Wert zu finden. Wenn es (der Pool) das Objekt nicht finden konnte, muss es eine Instanz erstellen, die den Parameter natürlich usw. übergibt.

Allerdings Apache Commons Pools und ähnliche Bibliotheken haben keine Vorkehrungen für diese Art von Konzept. Gibt es Bibliotheken, die diese Art von Konzept enthalten? Ich nehme an, unterhalb des Pools befindet sich eine Liste von Instanzen und wenn eine Take-Anfrage kommt, benutzt sie einen Matcher, um ihre verfügbaren Objekte zu durchlaufen und gibt den ersten zurück, der übereinstimmt.

Beachten Sie, dass es nicht möglich ist, den Parameter des Verbindungsobjekts zu ändern, daher das Problem und der Grund für die gestellte Frage.

  • Gibt es einen besseren Weg, dieses Problem zu lösen?
  • Gibt es eine Pooling-Bibliothek, die das oben genannte tut?
  • Soll ich nur meine eigene schreiben?
+0

warum können Sie nicht nur diff-Pools konfigurieren für diff-Parameter. haben eine Fassade für den Zugang zu all diesen Pools. Wenn die Fassade weiß, dass es keinen Pool für den gegebenen Eingabeparameter gibt, würde sie einen On-the-Fly erstellen –

+0

Weil es zu viele verschiedene Parameter gibt, was viele und viele Pools bedeuten würde. Wie ich in anderen Kommentar erwähnt habe - ich glaube, dass Apache Commons Pools nicht billig sind, da jeder Pool seinen eigenen Cleanup-Thread erstellt. Von meinem schnellen Blick scheint es nicht eine einfache Möglichkeit zu sein, ACP dazu zu bringen, den Aufräum-Thread zu teilen, so dass jede Poolerstellung mehr oder weniger eine billige Warteschlange mit einem Hintergrundaufreinigungs-Thread und der Lifecycle-Management-Sache ist. –

Antwort

1

Warum nicht den Schlüssel verwenden, um zuerst den Pool zu finden? Verwenden Sie dann eine der verfügbaren Lösungen. Ich glaube nicht, dass Sie alles vereinfachen würden, indem Sie versuchen, alles zusammenzulegen, da unterschiedlich codierte Elemente nicht kompatibel sind.

+0

Weil Sie Ihrem Rat folgen, werden die meisten dieser Pools auf der zweiten Ebene die meiste Zeit einen Gegenstand haben. Jeder Schlüssel wird wahrscheinlich nur eine Instanz haben, und es gibt eine kleine Chance für den aktuellen Thread, der diese Verbindung wieder zurück möchte. Es gibt jedoch eine geringe Chance, dass andere Threads die Verbindung benötigen und daher das Praktische zusammenlegen möchte. Ich bin mir nicht sicher, aber es scheint, dass das Erstellen von Apache Commons Pools nicht billig ist, da jeder, denke ich, erstellt seinen eigenen Pool-Thread zu reinigen. –

+1

Ich würde empfehlen zu bewerten, ob Sie tatsächlich Overhead-Probleme haben, über die Sie besorgt sind, bevor Sie versuchen, eine Lösung zu finden, die sie vermeidet.Vielleicht ist Ihre Arbeitsbelastung so groß, dass Sie keinen Unterschied in der Leistung bemerken ... Einfach zuerst, dann messen und optimieren Sie, wie es wirklich notwendig ist. –

0

Wenn das Objekt nicht Thread-sicher ist, warum Pooling? Ihr Pool-Manager kann den Status nicht überprüfen/trotzdem von einem anderen Thread schließen.

Behalten Sie nur eine Kopie in jedem Thread mit ThreadLocal.

+0

Ich denke, Sie haben den ganzen Punkt des Pooling verpasst. Während das Objekt ausgegeben wird, kann es niemand anders benutzen. Ich kann kein ThreadLocal behalten, da es viele Verbindungen gibt, die wahrscheinlich nie von diesem Thread wiederverwendet werden, aber insgesamt gibt es eine vernünftige Chance, dass sie wiederverwendet werden. –

+0

Also? Sie außer der Pooling-Manager machen die Aufräumarbeiten für Sie? Nein, so wird es nicht funktionieren. Pool reinigt entweder bei der nächsten Zuweisung (was in Ihrem Fall nie passiert) oder in einem separaten Thread. Da Ihre Verbindung nicht Thread-sicher ist, können Sie nicht auf anderen Thread aufräumen. –

+0

Ich glaube, du liegst falsch, wenn du verstehst, was eine Poolbereinigung bedeutet. Wenn ein gepoolter Gegenstand für einen bestimmten Zeitraum nicht benutzt wurde, ruft der Pool einen Gegenstand auf einem Helfer auf. Der gesamte Punkt von Pools besteht darin, eine Instanz jeweils nur einem Benutzer zu übergeben. –

0

KeyedObjectPool ist die Antwort, und wenn Sie ein Beispiel sehen möchten, haben einen Blick auf this

Verwandte Themen