在本系列之前的教程中,我们已经介绍了如何使用目前最常用的三种数据访问方式:
下面我们将分三篇来介绍在这三种数据访问方式之下,当我们需要多个数据源的时候,该如何使用的配置说明。
先在Spring Boot的配置文件 application.properties
中设置两个你要链接的数据库配置,比如这样:
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
来区分不同的数据源配置,这个前缀将在后续初始化数据源的时候用到。 spring.datasource.secondary.jdbc-url
,而1.x版本使用 spring.datasource.secondary.url
。如果你在配置的时候发生了这个报错 java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
,那么就是这个配置项的问题。 完成多数据源的配置信息之后,就来创建个配置类来加载这些配置信息,初始化数据源,以及初始化每个数据源要用的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); } }
@ConfigurationProperties
可以知道这两个数据源分别加载了 spring.datasource.primary.*
和 spring.datasource.secondary.*
的配置。 @Primary
注解指定了主数据源,就是当我们不特别指定哪个数据源的时候,就会使用这个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)); } }
@Qualifier
本文的相关例子可以查看下面仓库中的 chapter3-7
目录:
如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!