配置多数据源
- 1. 配置文件
- 2. 编写配置类
1. 配置文件
先在配置文件中定义数据库连接的基本信息,我这里是举例子所以设定了两个MySQL数据库。一般是支持同时配置不同数据库的
spring:datasource:# 本地数据库local:driver-class-name: com.mysql.cj.jdbc.Driver# jdbcUrl是Hikari连接池默认的url(依赖版本4.0.3不同版本可能不同),其他的可能不叫这个名字,具体可以上网查找名称jdbcUrl: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL&useAffectedRows=true&allowPublicKeyRetrieval=trueusername: rootpassword: 123456# 人事dev数据库oms:driver-class-name: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.50.21:3306/db2?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&lowerCaseTableNames=1username: rootpassword: 234567
2. 编写配置类
在写完配置文件之后,我们需要写相应的配置类去读取数据库的连接信息。
配置类1
@Configuration
@MapperScan(basePackages = "com.sykmi.local_dao.local",sqlSessionFactoryRef = "LocalSqlSessionFactory")
public class LocalDataSourceConfig {@Bean(name = "LocalDataSource")@ConfigurationProperties(prefix = "spring.datasource.local")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "LocalSqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("LocalDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/local/*.xml"));return bean.getObject();}@Bean(name = "LocalTransactionManager")@Primarypublic DataSourceTransactionManager transactionManager(@Qualifier("LocalDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
配置类2
@Configuration //代表该类为配置类
@MapperScan(basePackages = "com.sykmi.local_dao.oms",sqlSessionFactoryRef = "OmsSqlSessionFactory") //扫描指定的包,将包中的mapper接口关联到OmsSqlSessionFactory上
public class OmsDataSourceConfig {// 表示去配置文件找到spring.datasource.oms前缀(yml或properties配置文件)下的配置信息并按照读取到的信息创建数据源,bean的名称叫OmsDataSource@Bean(name = "OmsDataSource")@ConfigurationProperties(prefix = "spring.datasource.oms")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}// 生成SqlSessionFactory @Bean(name = "OmsSqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("OmsDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);// 绑定数据源bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/oms/*.xml"));// 指定 XML 映射文件路径return bean.getObject();}// 配置事务管理器 多数据源情况下可以给默认的事务管理器额外打个@Primary注解(参考上面LocalDataSourceConfig类),剩余的就像// 这样起名字即可(建议),在使用不同的数据源时如果遇到需要事务的情况下建议显式指定事务// 管理器,如@Transactional(value = "事务管理器名称")// tips:如果一个方法逻辑内调用了不同的数据源写入不同数据库,考虑使用分布式事务@Bean(name = "OmsTransactionManager")public DataSourceTransactionManager transactionManager(@Qualifier("OmsDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
可以大致看一下OMS数据源配置类的注释,基本都写了这个配置类做了什么