Frage

Ich habe eine Anforderung gegeben, wo ich mehrere Datenbanken in derselben Instanz unterstützen müssen, Multi-Tenancy zu unterstützen. Jede DB hat ein identisches Schema. Der Benutzer meldet sich eine bestimmte Datenbank aus einer Liste auswählen und alle nachfolgenden Anrufe an diese DB gehen wird, bis sie sich abmelden.

Ich mag hot swap die Sitzung Fabrik in einem einzigen HibernateDaoTemplate auf einem Parameter, der vom Kunden gelieferten basiert.

Ich kann viele Sachen auf Hot-Swapping-Datenquellen (damit verbunden und alle Transaktionsfragen) finden, aber ich mag Hot-Swap-Sitzung Fabriken -. All Caching für jede Halt

Was ist der einfachste Weg, dies zu tun? Konfigurieren eines HotSwappableTarget für die DaoTemplate? Kann mir jemand auf die Proben auf den Punkt, wie dies zu tun?

War es hilfreich?

Lösung

Wenn alle Datenbanken identisch sind, dann kann ich vorschlagen, eine einzige Session verwenden und eigene Implementierungen für die Datasource und Cache bereitstellt, die tatsächlich „Mieter-aware“ ist. (Diese Implementierung ist ziemlich trivial: nur eine Karte von Mieter-ID pflegen -> real Cache / real-Datenquelle und delegieren dann alle Anrufe an die entsprechenden eins). Konfigurieren Sie die einzelne Session Ihren Mieter-aware Cache und Datasource zu verwenden. Ein Thread kann verwendet werden, um die Mieter-ID der aktuellen Anforderung an jeden Code zur Verfügung zu stellen, die über sie wissen muss.

ich diesen Ansatz verwendet habe, bevor erfolgreich Multi-Tenancy zu unterstützen.

Andere Tipps

Wo ich zur Arbeit haben wir tat dies über Thread folgende diese führen. Wir haben nur ein Session und tauschte es Datenquelle auf einer Session-variablen basiert der Benutzer während angemeldet ändern könnte. ich die genauen Details nicht mehr erinnern, aber wenn Sie daran interessiert sind kann ich einige weitere Informationen ausgraben auf unserer Implementierung.

Das obwohl gesagt wird, sind jetzt die Jungs an meinem früheren Arbeitsplatz bewegt sich weg von diesem Ansatz und in Richtung einer sharded Datenbank. Auf jeden Fall eine elegantere Lösung, die ich Ihnen einen Blick würde empfehlen, auf.

erweitern DAO Klasse von HibernateDaoSupport, dann setSessionFactory () -Methode aufrufen, die Hot-Swap der Datenbanken zu tun

Sie können auch einen Blick auf die Hibernate Shards Projekt nehmen:

http://www.hibernate.org/414.html

..., die auf das Hinzufügen der Unterstützung für die horizontale Unterteilung in die Hibernate Core-fokussiert ist. Es ist noch nicht die volle Hibernate API decken, aber einen großen Teil davon nicht unterstützt (die nicht für Ihre Bedürfnisse ausreichend sein können oder nicht). Natürlich sind sie auf eine vollständige Abdeckung zu arbeiten.

Ich habe auch versucht, die Cache-Provider über Thread und der schwierige Teil auf der Cache den Hot-Swap wurde tun, müssen Sie die Session sicherstellen, dass alle aktiven Sitzungen Mitarbeiter nicht mit ihm. Nun, ich denke, es gibt eine viel bessere Lösung. Durch die Feder 3 Java-Konfiguration verwenden, können Sie Ihre Mieter-aware Session dynamisch erstellen und lassen den Frühling für Sie das Cache-Management zu tun

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