记录一下静态 Spring Boot 多数据源配置
应用场景
项目需要读取多个数据库A、B, A库(pms)为主要操作库,B库(confluence)只是单纯读取数据
多数据源
首先,将Spring Boot自带的DataSourceAutoConfiguration禁用掉, 因为它会自动读取配置文件中的spring.datasource.* 属性并配置单数据源,在启动类中
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class StartApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
然后是配置文件代码application.yml
spring:
datasource:
# A库
pms:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://******/name?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
username:
password:
# B库
confluence:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://**/name?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
username:
password:
下一步需要配置多数据源
@Configuration
public class DataSourceConfig {
@Bean(name = "pms")
// prefix的值是yml文件的属性
@ConfigurationProperties(prefix = "spring.datasource.pms")
// A库 设置为默认数据库
@Primary
public DataSource pms() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "confluence")
@ConfigurationProperties(prefix = "spring.datasource.confluence")
public DataSource confluence() {
// DataSourceBuilder.create().build() 这样数据监听会失效
return DruidDataSourceBuilder.create().build();
}
}
接下来是 两个配置类
@Configuration
// 扫描Mapper 的位置, sqlSessionFactoryRef 的值是 SqlSessionFactory 的方法名(confluenceSqlSessionFactory)
@MapperScan(basePackages = {"db.confluence.mapper"}, sqlSessionFactoryRef = "confluenceSqlSessionFactory")
public class MybatisConfluenceConfig {
@Autowired
@Qualifier("confluence")
private DataSource confluence;
@Bean
public SqlSessionFactory confluenceSqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(confluence);
// 读取mapper文件的位置,不添加可能会报错 找不到mapper文件
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/confluence/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate confluenceSqlSessionTemplate() throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(confluenceSqlSessionFactory());
return sqlSessionTemplate;
}
}
@Configuration
@MapperScan(basePackages = {"db.pms.mapper"}, sqlSessionFactoryRef = "pmsSqlSessionFactory")
public class MybatisPmsConfig {
@Autowired
@Qualifier("pms")
private DataSource pms;
@Bean
public SqlSessionFactory pmsSqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(pms);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/pms/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate pmsSqlSessionTemplate() throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(pmsSqlSessionFactory());
return sqlSessionTemplate;
}
}
当访问到 db.pms.mapper和 db.confluence.mapper 前者是A库, 后者是B库
配置完成,当访问到相对应的包下会自动切换到你所配置的数据源。
本人菜鸟,有问题一同讨论