之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源。在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties
文件中配置连接参数即可。但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面基于之前的JdbcTemplate和Spring-data-jpa例子分别介绍两种多数据源的配置方式。
多数据源配置
创建一个Spring配置类,定义两个DataSource用来读取application.properties
中的不同配置。如下例子中,主数据源配置为spring.datasource.primary
开头的配置,第二数据源配置为spring.datasource.secondary
开头的配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Configuration public class DataSourceConfig { @Bean (name = "primaryDataSource" ) @Qualifier ( "primaryDataSource" ) @ConfigurationProperties (prefix= "spring.datasource.primary" ) public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean (name = "secondaryDataSource" ) @Qualifier ( "secondaryDataSource" ) @Primary @ConfigurationProperties (prefix= "spring.datasource.secondary" ) public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } |
对应的application.properties
配置如下:
1
2
3
4
5
6
7
8
9
|
spring.datasource.primary.url=jdbc:mysql: //localhost:3306/test1 spring.datasource.primary.username=root spring.datasource.primary.password=root spring.datasource.primary.driver- class -name=com.mysql.jdbc.Driver spring.datasource.secondary.url=jdbc:mysql: //localhost:3306/test2 spring.datasource.secondary.username=root spring.datasource.secondary.password=root spring.datasource.secondary.driver- class -name=com.mysql.jdbc.Driver |
JdbcTemplate支持
对JdbcTemplate的支持比较简单,只需要为其注入对应的datasource即可,如下例子,在创建JdbcTemplate的时候分别注入名为primaryDataSource
和secondaryDataSource
的数据源来区分不同的JdbcTemplate。
1
2
3
4
5
6
7
8
9
10
11
|
@Bean (name = "primaryJdbcTemplate" ) public JdbcTemplate primaryJdbcTemplate( @Qualifier ( "primaryDataSource" ) DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean (name = "secondaryJdbcTemplate" ) public JdbcTemplate secondaryJdbcTemplate( @Qualifier ( "secondaryDataSource" ) DataSource dataSource) { return new JdbcTemplate(dataSource); } |
接下来通过测试用例来演示如何使用这两个针对不同数据源的JdbcTemplate。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
@RunWith (SpringJUnit4ClassRunner. class ) @SpringApplicationConfiguration (Application. class ) public class ApplicationTests { @Autowired @Qualifier ( "primaryJdbcTemplate" ) protected JdbcTemplate jdbcTemplate1; @Autowired @Qualifier ( "secondaryJdbcTemplate" ) protected JdbcTemplate jdbcTemplate2; @Before public void setUp() { jdbcTemplate1.update( "DELETE FROM USER " ); jdbcTemplate2.update( "DELETE FROM USER " ); } @Test public void test() throws Exception { // 往第一个数据源中插入两条数据 jdbcTemplate1.update( "insert into user(id,name,age) values(?, ?, ?)" , 1 , "aaa" , 20 ); jdbcTemplate1.update( "insert into user(id,name,age) values(?, ?, ?)" , 2 , "bbb" , 30 ); // 往第二个数据源中插入一条数据,若插入的是第一个数据源,则会主键冲突报错 jdbcTemplate2.update( "insert into user(id,name,age) values(?, ?, ?)" , 1 , "aaa" , 20 ); // 查一下第一个数据源中是否有两条数据,验证插入是否成功 Assert.assertEquals( "2" , jdbcTemplate1.queryForObject( "select count(1) from user" , String. class )); // 查一下第一个数据源中是否有两条数据,验证插入是否成功 Assert.assertEquals( "1" , jdbcTemplate2.queryForObject( "select count(1) from user" , String. class )); } } |