所谓多数据源,其实就是在一个项目中使用多个数据库实例中的数据库或者同一个数据库实例中多个不同的库。
在实际开发中可能会遇到需要配置多个数据源的情况,比如项目需要使用业务数据库和日志数据库等多个数据库,或者需要使用多种数据库(如MySQL、Oracle、SQL Server等)。
JdbcTemplate多数据源的配置比较简单,因为一个JdbcTemplate实例对应一个DataSource,开发者只需要手动提供多个DataSource,再手动配置相应的JdbcTemplate实例,需要操作哪个数据源就使用对应的JdbcTemplate实例即可。
步骤01 配置多数据源。
修改application.properties文件,配置数据源连接,示例代码如下:
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/jdbc_test
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/jdbc_test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
通过jdbc_test和jdbc_test2两个数据库演示多数据库的情况。我们可以看到上面的配置和原先单数据源的配置有些不同:
1)在application.properties配置文件中添加了两个数据源,通过primary和secondary来区分,分别对应的是jdbc_test和jdbc_test2数据库。
2)单数据源的数据库连接使用spring.datasource.url配置项,多数据源使用spring.datasource.*.jdbc-url配置项。
步骤02 配置JDBC初始化。
创建DataSourceConfig类,在项目启动时读取配置文件中的数据库信息,并对JDBC初始化,具体代码如下:
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "primaryDataSource" )
@Qualifier("primaryDataSource" )
@ConfigurationProperties(prefix = "spring.datasource.primary" )
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource" )
@Qualifier("secondaryDataSource" )
@ConfigurationProperties(prefix = "spring.datasource.secondary" )
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@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);
}
}
在上面的示例中,DataSourceConfig类的作用是在项目启动时根据特定的前缀加载不同的数据源,再根据构建好的数据源创建不同的JdbcTemplate。由于Spring容器中存在两个数据源,使用默认的类型查找时会报错,因此加上@Qualifier注解,表示按照名称查找。这里创建了两个JdbcTemplate实例,分别对应了两个数据源。
需要注意的是,使用多个数据源时需要添加@Primary注解,表示自动装配出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者。Primary表示“主要的”,类似于SQL语句中的“Primary Key”(主键),只能有唯一一个,否则会报错。
步骤03 使用多数据源。
配置完成之后如何使用呢?下面通过单元测试实例来演示使用多数据源。在测试列中注入了两个不同数据源的JdbcTemplate实例,测试使用不同的JdbcTemplate插入两条数据,查看两个数据库中是否全部保存成功。示例代码如下:
@Autowired
private JdbcTemplate primaryJdbcTemplate;
@Autowired
private JdbcTemplate secondaryJdbcTemplate;
@Test
public void dataSourceTest() {
Student student = new Student("多数据源", 0, 30);
primaryJdbcTemplate.update("INSERT INTO Student(name, sex, age) values(?, ?, ?)",
student.getName(), student.getSex(), student.getAge());
secondaryJdbcTemplate.update("INSERT INTO Student(name sex, age) values(?, ?, ?)",
student.getName(), student.getSex(), student.getAge());
}
单击Run Test或在方法上右击,选择Run ‘save2’,运行测试方法。
执行dataSourceTest()单元测试之后,我们看到系统自动创建了HikariPool-1和HikariPool-2两个数据库连接,查看数据库jdbc_test和jdbc_test2中的student表中是否有名为“多数据源”的数据,有则说明多数据源配置成功。其他方法的测试与此大致相同。
在实际开发的项目中,可以通过实现多数据源配置业务数据库与日志数据库分离。