Ich würde gerne sehen, ob es ein gutes Muster für die gemeinsame Nutzung eines Kontexts für alle Klassen und Subthreads eines Top-Level-Threads gibt, ohne InheritableThreadLocal
.
Ich habe mehrere Top-Level-Prozesse, die jeweils in ihrem eigenen Thread laufen. Diese Top-Level-Prozesse erzeugen oft temporäre Subthreads.
Ich möchte, dass jeder Prozess der obersten Ebene seine eigene Datenbankverbindung hat und verwaltet.
Ich habe pas die Datenbankverbindung von Klasse zu Klasse und von Thread zu Subthread weitergeben wollen (mein Kollege nennt dies das "Community Bicycle"-Muster). Dies sind große Top-Level-Prozesse und es würde bedeuten, dass wahrscheinlich Hunderte von Methodensignaturen bearbeitet werden müssten, um diese Datenbankverbindung weiterzugeben.
Im Moment rufe ich ein Singleton auf, um den Datenbankverbindungsmanager zu erhalten. Das Singleton verwendet InheritableThreadLocal
so dass jeder Top-Level-Prozess seine eigene Version davon hat. Ich weiß zwar, dass einige Leute Probleme mit Singletons haben, aber das bedeutet, dass ich einfach sagen kann DBConnector.getDBConnection(args)
(um es mal so auszudrücken), wenn ich eine korrekt verwaltete Verbindung brauche. Ich bin nicht an diese Methode gebunden, wenn ich eine bessere und dennoch saubere Lösung finden kann.
Aus verschiedenen Gründen InheritableThreadLocal
erweist sich als knifflig. (Siehe diese Frage .)
Hat jemand einen Vorschlag, wie man so etwas handhaben kann, ohne dass man entweder InheritableThreadLocal
oder ein Kontextobjekt überall herumreichen?
Danke für jede Hilfe!
Update: Ich habe es geschafft, das unmittelbare Problem zu lösen (siehe die verlinkte Frage), aber ich würde immer noch gerne von anderen möglichen Ansätzen hören. Der Vorschlag von forty-two unten ist gut und funktioniert (danke!), aber siehe die Kommentare, warum er problematisch ist. Wenn die Leute für jtahlborns Antwort stimmen und mir sagen, dass ich zwanghaft bin, weil ich die Weitergabe meiner Datenbankverbindung vermeiden will, werde ich einlenken, diese Antwort wählen und meine Weltanschauung revidieren.