Wie kann ich zwei Datenquellen konfigurieren und verwenden?
Zum Beispiel habe ich Folgendes für die erste Datenquelle:
application.properties
#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver
#second db ...
Anwendungsklasse
@SpringBootApplication
public class SampleApplication
{
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
Wie ändere ich, um application.properties
eine weitere Datenquelle hinzuzufügen? Wie verdrahte ich es automatisch, um es von einem anderen Repository zu verwenden?
java
spring
spring-boot
spring-mvc
datasource
juventus
quelle
quelle
Update 2018-01-07 mit Spring Boot 1.5.8.RELEASE
Die meisten Antworten enthalten keine Informationen zur Verwendung (als Datenquelle selbst und als Transaktion), sondern nur zur Konfiguration.
Sie können das ausführbare Beispiel und einige Erklärungen unter https://www.surasint.com/spring-boot-with-multiple-databases-example/ sehen.
Ich habe hier einen Code kopiert.
Zuerst müssen Sie application.properties wie folgt festlegen
Definieren Sie sie dann wie folgt als Anbieter (@Bean):
Beachten Sie, dass ich @Bean (Name = "Datenquelle1") und @Bean (Name = "Datenquelle2") habe. Sie können es dann verwenden, wenn wir Datenquelle als @Qualifier ("Datenquelle1") und @Qualifier ("Datenquelle2") benötigen. beispielsweise
Wenn Sie sich für eine Transaktion interessieren, müssen Sie DataSourceTransactionManager für beide wie folgt definieren:
Dann kannst du es gerne benutzen
oder
Das sollte reichen. Siehe Beispiel und Details im obigen Link.
quelle
Siehe die offizielle Dokumentation
Das Erstellen mehrerer Datenquellen funktioniert genauso wie das Erstellen der ersten. Möglicherweise möchten Sie eine davon als @Primary markieren, wenn Sie die Standard-Autokonfiguration für JDBC oder JPA verwenden (diese wird dann von allen @ Autowired-Injektionen übernommen).
quelle
Ich musste auch eine Verbindung zu 2 Datenquellen aus der Spring Boot-Anwendung herstellen, und es war nicht einfach - die in der Spring Boot-Dokumentation erwähnte Lösung funktionierte nicht. Nach langem Stöbern im Internet habe ich es zum Laufen gebracht und die Hauptidee wurde aus diesem Artikel und vielen anderen Orten übernommen.
Die folgende Lösung ist in geschrieben Kotlin geschrieben und funktioniert mit Spring Boot 2.1.3 und Hibernate Core 5.3.7 . Das Hauptproblem war, dass es nicht ausreichte, nur verschiedene DataSource- Konfigurationen einzurichten, sondern auch EntityManagerFactory und TransactionManager für beide Datenbanken zu konfigurieren .
Hier ist die Konfiguration für die erste (primäre) Datenbank:
Und das ist die Konfiguration für die zweite Datenbank:
Die Eigenschaften für Datenquellen lauten wie folgt:
Das Problem mit den Eigenschaften war, dass ich jdbc-url anstelle von url definieren musste, da ich sonst eine Ausnahme hatte.
ps Möglicherweise haben Sie auch unterschiedliche Namensschemata in Ihren Datenbanken, was bei mir der Fall war. Da Hibernate 5 nicht alle vorherigen Namensschemata unterstützt, musste ich eine Lösung aus dieser Antwort verwenden - vielleicht hilft es auch jemandem.
quelle
mapOf("hibernate.physical_naming_strategy" to "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy", "hibernate.implicit_naming_strategy" to "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy" )
Hier ist die Komplettlösung
Da wir auf zwei verschiedene Datenbanken (db1, db2) zugreifen können, müssen wir jede Datenquellenkonfiguration separat konfigurieren, wie:
Zweite Datenquelle:
Hier finden Sie das vollständige Beispiel in meinem Blog: Spring Boot mit Konfiguration mehrerer DataSource
quelle
quelle
Ich habe mybatis - springboot 2.0 tech stack verwendet, Lösung:
Hinweis: 1) @Primary -> @primary
2) ---. "Jdbc-url" in den Eigenschaften -> Nach der Migration von Spring Boot 2.0: jdbcUrl ist mit driverClassName erforderlich
quelle
@ Primäre Annotation funktioniert bei Verwendung mit einer Methode wie der folgenden, wenn sich die beiden Datenquellen auf demselben Datenbankspeicherort / Server befinden.
Wenn sich die Datenquellen auf verschiedenen Servern befinden, ist es besser, @Component zusammen mit der @ Primary- Annotation zu verwenden. Das folgende Codefragment funktioniert gut mit zwei verschiedenen Datenquellen an verschiedenen Orten
quelle
Meine Anforderung war etwas anders, verwendete aber zwei Datenquellen.
Ich habe zwei Datenquellen für dieselben JPA-Entitäten aus demselben Paket verwendet. Eine für die Ausführung von DDL beim Serverstart zum Erstellen / Aktualisieren von Tabellen und eine andere für DML zur Laufzeit.
Die DDL-Verbindung sollte geschlossen werden, nachdem DDL-Anweisungen ausgeführt wurden, um die weitere Verwendung von Super-User-Previlleges an einer beliebigen Stelle im Code zu verhindern.
Eigenschaften
Datenquellen-Konfigurationsklassen
// 1. Konfigurationsklasse für DDL-Datenquelle
// 2. Konfigurationsklasse für DML-Datenquelle
// Verwendung von DDL-Datenquellen im Code.
// Verwendung der DML-Datenquelle im Code.
quelle