Ich habe eine Anforderung erhalten, dass ich mehrere Datenbanken in derselben Instanz unterstützen muss, um die Mandantenfähigkeit zu unterstützen. Jeder DB hat ein identisches Schema. Der Benutzer meldet sich bei einer bestimmten Datenbank an, indem er aus einer Liste auswählt, und alle folgenden Aufrufe werden an diese Datenbank gesendet, bis sie sich abmelden.
Ich möchte die Sitzungs-Factory in einem einzelnen HibernateDaoTemplate austauschen, basierend auf einem vom Client bereitgestellten Parameter.
Ich kann viele Informationen zu Hot-Swapping-Datenquellen (und allen damit verbundenen Transaktionsproblemen) finden, aber ich möchte Sitzungsfabriken im laufenden Betrieb austauschen und dabei alle Zwischenspeicher behalten.
Was ist der einfachste Weg dies zu tun? Konfigurieren Sie ein HotSwappableTarget für das DaoTemplate? Kann mir jemand auf Beispiele zeigen, wie man das macht?
Wenn alle Datenbanken identisch sind, kann ich vorschlagen, eine einzelne SessionFactory zu verwenden und eigene Implementierungen für die DataSource und den Cache bereitzustellen, die tatsächlich "mieterbewusst" sind. (Diese zu implementieren ist ziemlich trivial: Behalte einfach eine Karte der Mandanten-ID bei - & gt; echten Cache / echte Datenquelle und delegiere dann alle Aufrufe an die passende). Konfigurieren Sie die einzelne SessionFactory für die Verwendung des Tenant-aware-Cache und der DataSource. Ein ThreadLocal kann verwendet werden, um die Mandanten-ID der aktuellen Anfrage jedem Code zur Verfügung zu stellen, der darüber informiert werden muss.
Ich habe diesen Ansatz vor der erfolgreichen Unterstützung der Mandantenfähigkeit verwendet.
Wo ich früher gearbeitet habe, haben wir dies über ThreadLocal getan, indem wir dieses Handbuch gefolgt haben Wir haben nur eine SessionFactory verwendet und ihre Datenquelle basierend auf einer Sitzungsvariablen ausgetauscht, die der Benutzer ändern konnte, während er eingeloggt war. Ich kann mich nicht an die genauen Details erinnern, aber wenn Sie interessiert sind, kann ich weitere Informationen zu unserer Implementierung finden.
Aber die Leute an meinem früheren Arbeitsplatz bewegen sich jetzt von diesem Ansatz weg und auf eine geschaffte Datenbank zu. Definitiv eine elegantere Lösung, die ich Ihnen empfehlen würde, einen Blick darauf zu werfen.
Erweitern Sie Ihre DAO-Klasse von HibernateDaoSupport und rufen Sie dann die Methode setSessionFactory () auf, um den Hot-Swap der Datenbanken durchzuführen
Sie können sich auch das Hibernate Shards-Projekt ansehen:
... konzentriert sich auf das Hinzufügen von Unterstützung für die horizontale Partitionierung des Hibernate Core. Es deckt zwar noch nicht die vollständige Hibernate-API ab, unterstützt jedoch einen großen Teil davon (was für Ihre Anforderungen möglicherweise ausreichend ist). Natürlich arbeiten sie auf eine vollständige Abdeckung hin.
Ich habe auch den Cache-Provider über ThreadLocal ausprobiert, und der schwierige Teil bestand darin, den Hot-Swap im Cache durchzuführen. Sie müssen sicherstellen, dass der SessionFactory keine aktiven Sessions zugeordnet sind. Nun, ich denke, es gibt eine viel bessere Lösung: Durch die Verwendung der Spring 3-Java-Konfiguration können Sie Ihre Tenant-aware-SessionFactory dynamisch erstellen und Spring die Cache-Verwaltung für Sie übernehmen lassen.
Tags und Links hibernate spring sessionfactory