2016-07-04 29 views
1

Welcher ist der beste Ansatz zum Implementieren mehrerer verschiedener Datenbanken in einem Projekt mithilfe von Spring JdbcDaoSupport?Verwenden verschiedener Datenbanken mit Spring jdbcDaoSupport

Ich habe mehrere DB mit verschiedenen Datenquellen und Syntax: MySQL & Postgres, zum Beispiel. In reinen java-jdbc-Projekten verwendete ich Factory Method- und Abstract Factory-Muster und mehrere DAOimpl-Klassen (eine für jede DB) mit gemeinsamen DAO-Schnittstellen für den Wechsel zwischen Datenbanken. Jetzt verwende ich Spring-jdbc und möchte ähnliches Verhalten implementieren.

Antwort

0

Ich war vor zwei Jahren mit der gleichen Sache konfrontiert und wählte schließlich eine Implementierung basierend auf einem "Spring Custom Scope" (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-scopes-custom).

Das Spring-Framework ermöglicht die Koexistenz mehrerer Instanzen derselben Bean-Definition. Sie unterscheiden sich nur von einigen Kontexteinstellungen.
Zum Beispiel wird diese Bohne Definition verschiedene loginaction Bean erstellen je nach aktuell verarbeiteten HTTP-Anforderung

<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>

Wenn Sie einen benutzerdefinierten Bereich „Domain“ genannt erstellen, können Sie auf mehrere Datenquelle basierte auf instanziiert die gleiche Bean-Definition.
Eine Datenquellen-Bean-Definition basierend auf JndiObjectFactoryBean würde den Servlet-Container die Datenbankverbindung verwalten lassen (über die Datei web.xml). Sie müssten jedoch den Namen Ihrer Datenquelle mit einer Spring-Eigenschaft ändern.
Bohnen wie der Datenbank-Transaktionsmanager müssen ebenfalls mit diesem Bereich markiert sein.

Als nächstes müssen Sie den Geltungsbereich jedes Mal aktivieren, wenn eine HTTP-Anfrage ausgeführt wird: Ich kann vorschlagen, dass Sie den Namen der Datenquelle als Präfix der Anfrage-URL definieren.

Da die meisten Web-Frameworks das Abfangen von HTTP-Anforderungen ermöglichen, können Sie die erwartete Datenquelle vor der Verarbeitung der Anforderung abrufen.
Dann erstellen (oder Wiederverwendung) eine Reihe von Bohnen spezifisch für die ausgewählte Datenquelle und speichern sie in einer Thread Variable (dass Ihre benutzerdefinierten Bereich Implementierung verlassen wird)

Diese Implementierung ein wenig komplex auf den ersten Blick aussehen sollte , aber seine Verwendung erscheint transparent.