2016-08-05 3 views
3

현재 하나의 데이터베이스가 연결되어 작동 중입니다. 다른 (그리고 결국 2 개) 데이터베이스를 연결하고 싶습니다. 어떻게해야합니까? 어노테이션과 특성 파일 만 사용하는 솔루션이 있어야합니다.JPA 봄 부팅 : 여러 데이터베이스를 어떻게 연결합니까?

나는이 Profile Specific Properties 을 읽었으며, 도움이되었다.하지만 런타임 중에 코드에서 한 프로필에서 다른 프로필로 전환하는 방법을 모르겠다. 다른 데이터베이스에서 물건을 검색/유지하려고하기 전에 한 번에 하나의 프로필에 연결해야한다고 가정합니다.

나는이 질문을 How to use 2 or more databases with spring?에서도 읽었지만, 어떻게 적용되는지 잘 모르겠다. 나는 컨트롤러 클래스를 사용하지 않고 무엇이 그 일을하는지 모른다. 또한 응답에서 언급 한 config 클래스가 실제로 특정 DO에 어떻게 연결되는지 잘 모르겠습니다.

이 내 application.properties 파일입니다

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 

     }; 
    } 
} 

나는 또한 새로운했다 : 이것은 내 응용 프로그램 파일입니다

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 

(내 파일에 자사가 사용자 이름과 암호 만을 표시) application-MTS.properties라는 속성 파일을 만들고 거기에 새 데이터베이스의 데이터를 넣습니다. 아직도 그걸로 무엇을 해야할지 잘 모릅니다.

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

답변

4

각각 사용할 다양한 데이터베이스 연결 자원을 나타내는 복수 DataSource bean을 정의해야합니다.

그런 다음 DataSource bean 각각에 대해 TransactionManagerEntityManagerFactory bean 정의를 추가해야합니다.

DataSource을 JTA 트랜잭션에 참여 시키려면 개별 자원 로컬 트랜잭션 관리자가 아닌 JTA 트랜잭션 관리자를 구성하는 것도 고려해야합니다.

+0

[샘플 프로젝트는 여기에 있습니다] (https://github.com/snicoll-demos/demo-multi-entity-managers) –