이 시리즈의 이전 자습서에서 가장 일반적으로 사용되는 세 가지 데이터 액세스 방법을 사용하는 방법을 소개했습니다.
아래에서는 여러 데이터 소스가 필요할 때 이러한 세 가지 데이터 액세스 방법을 사용하는 방법에 대한 구성 지침을 소개하는 세 개의 문서로 나뉩니다.
여러 데이터 소스의 구성 추가
먼저 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
설명 및 참고 :
- 다수의 데이터 소스를 구성하는 경우, 하나의 데이터 소스의 차이이다
spring.datasource
데이터 소스 이름을 설정 한 후에primary
그리고secondary
다른 데이터 소스 구성을 구별이 접두어는 데이터 소스의 후속의 초기화에 사용된다. - 데이터 소스 연결 구성 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);
}
}
설명 및 참고 :
- 처음 두 개의 Bean은 데이터 소스의 생성이며,
@ConfigurationProperties
이 두 데이터 소스가 각각로드spring.datasource.primary.*
되고spring.datasource.secondary.*
구성 되었음을 알 수 있습니다 . @Primary
어노테이션은 기본 데이터 소스를 지정합니다. 즉, 데이터 소스를 지정하지 않으면이 Bean이 사용됩니다.- 후자의 두 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));
}
}
설명 및 참고 :
- 여기서 물어볼 수 있습니다. 두 개의 JdbcTemplate이 있습니다. 왜
@Qualifier
지정 하지 않습니까? 덧붙여서, 여기에 약간의 지식 포인트가 있습니다. 지정하지 않으면 매개 변수의 이름이 Bean을 찾는 데 사용되며 존재하는 경우 주입됩니다. - 두 개의 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의 다중 데이터 소스 구성에 처음 게시되었습니다. 재 인쇄 할 소스를 지정하십시오. 이 시리즈의 주제별 콘텐츠는 무료 학습을 클릭 할 수 있습니다 !