Spring Boot 2.x 기본 튜토리얼 : JdbcTemplate의 다중 데이터 소스 구성

이 시리즈의 이전 자습서에서 가장 일반적으로 사용되는 세 가지 데이터 액세스 방법을 사용하는 방법을 소개했습니다.

아래에서는 여러 데이터 소스가 필요할 때 이러한 세 가지 데이터 액세스 방법을 사용하는 방법에 대한 구성 지침을 소개하는 세 개의 문서로 나뉩니다.

여러 데이터 소스의 구성 추가

먼저 application.properties다음과 같이 Spring Boot 구성 파일 에 링크하려는 두 개의 데이터베이스 구성을 설정하십시오 .

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

설명 및 참고 :

  1. 다수의 데이터 소스를 구성하는 경우, 하나의 데이터 소스의 차이이다 spring.datasource데이터 소스 이름을 설정 한 후에 primary그리고 secondary다른 데이터 소스 구성을 구별이 접두어는 데이터 소스의 후속의 초기화에 사용된다.
  2. 데이터 소스 연결 구성 2.x 및 1.x 구성 항목은 2.x 사용 spring.datasource.secondary.jdbc-url및 1.x 버전 사용 이 다릅니다 spring.datasource.secondary.url. 구성 중에이 오류가 발생하면이 java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.구성 항목에 문제가있는 것입니다.

관련 읽기 : Spring Boot 1.x 기본 튜토리얼 : 다중 데이터 소스 구성

데이터 소스 및 JdbcTemplate 초기화

여러 데이터 소스에 대한 구성 정보를 완료 한 후 구성 정보를로드하고 데이터 소스를 초기화하고 각 데이터 소스에서 사용하는 JdbcTemplate을 초기화하는 구성 클래스를 작성하십시오. 완료하려면 Spring Boot 애플리케이션 아래에 다음 구성 클래스를 추가하기 만하면됩니다!

@Configuration
public class DataSourceConfiguration {
    
    

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
    
    
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
    
    
        return DataSourceBuilder.create().build();
    }

    @Bean
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
    
    
        return new JdbcTemplate(primaryDataSource);
    }

    @Bean
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
    
    
        return new JdbcTemplate(secondaryDataSource);
    }

}

설명 및 참고 :

  1. 처음 두 개의 Bean은 데이터 소스의 생성이며, @ConfigurationProperties이 두 데이터 소스가 각각로드 spring.datasource.primary.*되고 spring.datasource.secondary.*구성 되었음을 알 수 있습니다 .
  2. @Primary어노테이션은 기본 데이터 소스를 지정합니다. 즉, 데이터 소스를 지정하지 않으면이 Bean이 사용됩니다.
  3. 후자의 두 Bean은 각 데이터 소스에 해당합니다 JdbcTemplate. 이 두 가지가 JdbcTemplate생성되었을 때 primaryDataSource데이터 소스와 secondaryDataSource데이터 소스 가 각각 삽입 된 것을 볼 수 있습니다.

시험을 받다

위의 내용을 완료 한 후 다음과 같이 위의 여러 데이터 소스 구성이 올바른지 테스트하는 테스트 클래스를 작성할 수 있습니다.

@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter37ApplicationTests {
    
    

    @Autowired
    protected JdbcTemplate primaryJdbcTemplate;

    @Autowired
    protected JdbcTemplate secondaryJdbcTemplate;

    @Before
    public void setUp() {
    
    
        primaryJdbcTemplate.update("DELETE  FROM  USER ");
        secondaryJdbcTemplate.update("DELETE  FROM  USER ");
    }

    @Test
    public void test() throws Exception {
    
    
        // 往第一个数据源中插入 2 条数据
        primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20);
        primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30);

        // 往第二个数据源中插入 1 条数据,若插入的是第一个数据源,则会主键冲突报错
        secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20);

        // 查一下第一个数据源中是否有 2 条数据,验证插入是否成功
        Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class));

        // 查一下第一个数据源中是否有 1 条数据,验证插入是否成功
        Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
    }

}

설명 및 참고 :

  1. 여기서 물어볼 수 있습니다. 두 개의 JdbcTemplate이 있습니다. 왜 @Qualifier지정 하지 않습니까? 덧붙여서, 여기에 약간의 지식 포인트가 있습니다. 지정하지 않으면 매개 변수의 이름이 Bean을 찾는 데 사용되며 존재하는 경우 주입됩니다.
  2. 두 개의 JdbcTemplate을 만들 때 이름을 지정하지 않았는데 어떻게 일치합니까? 이것은 또한 작은 지식 포인트이며, Bean을 생성 할 때 기본적으로 메소드 이름이 Bean의 이름으로 사용되므로 여기에 대응이 있습니다. 독자들은 두 이름이 같은지 되돌아보고 싶을 수 있습니까?

코드 예

이 기사의 관련 예제는 다음웨어 하우스의 chapter3-7디렉토리 를 볼 수 있습니다 .

  • Github : https : //github.com/dyc87112/SpringBoot-Learning/
  • 기티 : https : //gitee.com/didispace/SpringBoot-Learning/

이 기사가 좋다고 생각한다면 스타 지원을 환영합니다. 여러분의 관심은 저의 끈기에 대한 동기입니다!

이 기사는 Spring Boot 2.x Basic Tutorial : JdbcTemplate의 다중 데이터 소스 구성에 처음 게시되었습니다. 재 인쇄 할 소스를 지정하십시오. 이 시리즈의 주제별 콘텐츠는 무료 학습을 클릭 할 수 있습니다 !

추천

출처blog.csdn.net/dyc87112/article/details/106891180