2016-08-05 51 views
3

Ich habe derzeit eine Datenbank verbunden und es funktioniert. Ich möchte eine andere (und eventuell 2 weitere) Datenbanken verbinden. Wie mache ich das? Es sollte eine Lösung geben, die nur Annotations- und Eigenschaftendateien verwendet.Spring Boot JPA: Wie verbinde ich mehrere Datenbanken?

Ich lese diese Profile Specific Properties und es irgendwie hilft, aber ich weiß noch nicht, wie Schalter von einem Profil auf dem anderen in den Code während der Laufzeit. Ich gehe davon aus, dass ich zu einem Zeitpunkt mit einem Profil verbunden sein muss, bevor ich versuche, Dinge aus verschiedenen Datenbanken abzurufen.

Ich lese auch diese Frage, How to use 2 or more databases with spring?, aber ich weiß nicht, wie es zu gut funktioniert/wenn es zutreffen wird. Ich verwende keine Controller-Klasse und ich weiß nicht, was das bedeutet. Ich bin auch nicht sicher, wie die Config-Klasse, die sie in der Antwort erwähnen, tatsächlich mit dem spezifischen DO verbunden ist.

Dies ist meine Datei application.properties: (markiert Benutzernamen und Passwort, aber seine dort in meiner Datei)

hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect 
hibernate.show_sql=true 
hibernate.format_sql=true 
hibernate.default_schema=dbo 
hibernate.packagesToScan=src.repositories.LMClientRepository.java 

spring.jpa.generate-ddl=true 
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy 
spring.datasource.username=*** 
spring.datasource.password=*** 
spring.datasource.url=jdbc:sqlserver://schqvsqlaod:1433;database=dbMOBClientTemp;integratedSecurity=false; 
spring.datasource.testOnBorrow=true 
spring.datasource.validationQuery=SELECT 1 
spring.jpa.database=dbMOBClientTemp 
spring.jpa.show-sql=true 
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect 
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver 

Diese Datei meine Anwendung ist:

package testApplication; 

import java.util.ArrayList; 
import java.util.List; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.orm.jpa.EntityScan; 
import org.springframework.cache.annotation.EnableCaching; 
import org.springframework.context.annotation.Bean; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 

import fileRetrieval.InputFileParse; 
import lmDataObjects.LMClientDO; 
import lmDataObjects.LoadMethodDO; 
import repositories.LMClientRepository; 
import repositories.LoadMethodRepository; 

@SpringBootApplication 
@EnableJpaRepositories(basePackageClasses = LoadMethodRepository.class) 
@EntityScan(basePackageClasses = LoadMethodDO.class) 
@EnableCaching 
public class Application { 

    private static final Logger log = LoggerFactory.getLogger(Application.class); 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public CommandLineRunner demo(LoadMethodRepository lm_repo, LMClientRepository lmc_repo) { 
     return (args) -> { 
      List<LMClientDO> lmlist = InputFileParse.getMultiGroupfile(); 

      List<String> uniqueMediaIds = new ArrayList(InputFileParse.getUniqueMediaIds()); 

      for (int i = 0; i < InputFileParse.getUniqueMediaIds().size(); i ++){ 
       lm_repo.save(new LoadMethodDO(uniqueMediaIds.get(i))); 
      } 

      for (int i = 0; i < lmlist.size(); i++){ 
       lmc_repo.save(new LMClientDO(lmlist.get(i).getClientId(), lmlist.get(i).getMediaId())); 
      } 
      //Here is where I would like to do stuff with data from the other database that I have not connected yet 

     }; 
    } 
} 

Ich habe auch eine neue Eigenschaftendatei namens application-MTS.properties, und ich habe dort Daten für die neue Datenbank abgelegt. Immer noch unsicher, was damit zu tun ist.

spring.datasource.username=*** 
spring.datasource.password=*** 
spring.datasource.url=jdbc:sqlserver://SCHQVSQLCON2\VSPD:1433;database=dbMTS;integratedSecurity=false; 

Antwort

4

Sie müssen mehrere DataSource Bohnen definieren, die jeweils die verschiedenen Datenbank-Verbindungsressourcen stellen Sie verwenden möchten.

Sie müssen dann eine TransactionManager und EntityManagerFactory Bean-Definition für jede dieser Bohnen hinzufügen.

Wenn Sie beabsichtigen, alle DataSource an einer JTA-Transaktion teilnehmen zu lassen, müssen Sie auch die Konfiguration eines JTA-Transaktionsmanagers anstelle von lokalen Transaktionsmanagern für einzelne Ressourcen in Betracht ziehen.

+0

Es gibt auch ein [Beispielprojekt hier] (https://github.com/snicoll-demos/demo-multi-entity-managers) –