Jak mogę skonfigurować i korzystać z dwóch źródeł danych?
Na przykład oto, co mam dla pierwszego źródła danych:
application.properties
#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver
#second db ...
Klasa zastosowania
@SpringBootApplication
public class SampleApplication
{
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
Jak zmodyfikować, application.properties
aby dodać kolejne źródło danych? Jak mogę automatycznie używać go w innym repozytorium?
java
spring
spring-boot
spring-mvc
datasource
juventus
źródło
źródło
Aktualizacja 2018-01-07 z Spring Boot 1.5.8. ZWOLNIENIE
Większość odpowiedzi nie podaje, jak ich używać (jako samego źródła danych i jako transakcji), a jedynie jak je skonfigurować.
Możesz zobaczyć wykonalny przykład i wyjaśnienie w https://www.surasint.com/spring-boot-with-multiple-databases-example/
Skopiowałem tutaj trochę kodu.
Najpierw musisz ustawić application.properties w ten sposób
Następnie zdefiniuj ich jako dostawców (@Bean) w następujący sposób:
Zauważ, że mam @Bean (name = "datasource1") i @Bean (name = "datasource2"), wtedy możesz go użyć, gdy potrzebujemy źródła danych jako @Qualifier ("datasource1") i @Qualifier ("datasource2"), na przykład
Jeśli zależy Ci na transakcji, musisz zdefiniować DataSourceTransactionManager dla obu z nich, w następujący sposób:
Następnie możesz go użyć jak
lub
To powinno wystarczyć. Zobacz przykład i szczegóły w linku powyżej.
źródło
Zapoznaj się z oficjalną dokumentacją
Utworzenie więcej niż jednego źródła danych działa tak samo jak utworzenie pierwszego. Możesz zaznaczyć jeden z nich jako @Primary, jeśli używasz domyślnej automatycznej konfiguracji dla JDBC lub JPA (wtedy ta zostanie przechwycona przez dowolne zastrzyki @Autowired).
źródło
Musiałem także skonfigurować połączenie z 2 źródłami danych z aplikacji Spring Boot i nie było to łatwe - rozwiązanie wspomniane w dokumentacji Spring Boot nie zadziałało. Po długim kopaniu w Internecie sprawiłem, że działało, a główny pomysł wziął z tego artykułu i wielu innych miejsc.
Poniższe rozwiązanie zostało napisane w Kotlin i działa z Spring Boot 2.1.3 i Hibernate Core 5.3.7 . Głównym problemem było to, że nie wystarczyło tylko skonfigurować różne konfiguracje DataSource , ale konieczne było również skonfigurowanie EntityManagerFactory i TransactionManager dla obu baz danych.
Oto konfiguracja pierwszej (podstawowej) bazy danych:
Oto konfiguracja dla drugiej bazy danych:
Właściwości źródeł danych są następujące:
Problem z właściwościami polegał na tym, że musiałem zdefiniować jdbc-url zamiast url, ponieważ w przeciwnym razie miałem wyjątek.
ps Również możesz mieć różne schematy nazewnictwa w swoich bazach danych, co miało miejsce w moim przypadku. Ponieważ Hibernate 5 nie obsługuje wszystkich poprzednich schematów nazewnictwa, musiałem skorzystać z rozwiązania z tej odpowiedzi - być może pomoże to również komuś.
źródło
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" )
Oto kompletne rozwiązanie
Ponieważ uzyskamy dostęp do dwóch różnych baz danych (db1, db2), musimy skonfigurować każdą konfigurację źródła danych osobno:
Drugie źródło danych:
Tutaj znajdziesz pełny przykład na moim blogu: Spring Boot with Multiple DataSource Configuration
źródło
źródło
Użyłem mybatis - stos technologii Springboot 2.0, rozwiązanie:
Uwaga: 1) @ Podstawowy -> @ podstawowy
2) ---. „Jdbc-url” we właściwościach -> Po migracji Spring Boot 2.0: wymagane jest jdbcUrl dla driverClassName
źródło
@ Pierwotna adnotacja w przypadku użycia metody takiej jak poniżej działa dobrze, jeśli dwa źródła danych znajdują się w tej samej lokalizacji / serwerze db.
Jeśli źródła danych znajdują się na różnych serwerach, lepiej użyć @Component wraz z adnotacją @Primary . Poniższy fragment kodu działa dobrze w dwóch różnych źródłach danych w różnych lokalizacjach
źródło
Moje wymaganie było nieco inne, ale wykorzystałem dwa źródła danych.
Użyłem dwóch źródeł danych dla tych samych podmiotów JPA z tego samego pakietu. Jeden do wykonywania DDL podczas uruchamiania serwera w celu tworzenia / aktualizacji tabel, a drugi do DML w czasie wykonywania.
Połączenie DDL powinno zostać zamknięte po wykonaniu instrukcji DDL, aby zapobiec dalszemu wykorzystaniu uprzywilejowanych uprawnień superużytkowników w dowolnym miejscu w kodzie.
Nieruchomości
Klasy konfiguracji źródła danych
// 1. klasa konfiguracji dla źródła danych DDL
// 2. klasa konfiguracji dla źródła danych DML
// Wykorzystanie źródeł danych DDL w kodzie.
// Wykorzystanie źródła danych DML w kodzie.
źródło