背景
在微服务李娜一般一个服务只有一个数据源,但是在有的老项目或者一些特定场景需要多数据源链接不同的数据库,本文以mybatisPlus为基础给出解决方案
多数据源场景分类
- 情形一:项目启动就确定了
- 情形一:一些sass系统里面动态确定的,比如说运行时建立的数据源,还有一些报表场景也是如此 本文暂不讨论相关
解决方案(本人都有使用过):
1.mybatisPlus官网提供的 提供框架,使用是使用注解切换 缺点很大,不建议
2.使用sharding等分库分表工具,这个是可以用来当做多数据源的解决方案的
3.分包 本文使用次方案
项目环境
springboot3.x mybatisPlus3.5.3(低于该版本会有问题,因为spring有的类被删除了会报错)
讲道理23年使用springboot3.x不应该使用mybatis的,mybatis目前还不支持native编译,但是本文属于后端项目,不适用native也无所谓
配置文件
master配置
@Configuration
@MapperScan(basePackages = "com.git.mapper.mysql", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.hikari.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
//MybatisSqlSessionFactoryBean这个要换成mybatisPlus的,不然没有一些通用sql的功能
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setGlobalConfig(masterGlobalConfig());
sessionFactoryBean.setPlugins(masterPlusInterceptor());
sessionFactoryBean.setVfs(SpringBootVFS.class);
//还能设置xml扫描路径,别名配置等,本文比较野直接注解
return sessionFactoryBean.getObject();
}
@Bean("masterTransactionManager")
@Primary
// 数据源事务管理器
public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "masterSqlSessionTemplate")
@Primary
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean("masterGlobalConfig")
public GlobalConfig masterGlobalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
return globalConfig;
}
/**
* 分页插件
*/
@Bean("masterPlusInterceptor")
public MybatisPlusInterceptor masterPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
slave配置
@Configuration
@MapperScan(basePackages = "com.git.mapper.sqlserver", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaveDataSourceConfig {
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.hikari.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setGlobalConfig(slaveGlobalConfig());
sessionFactoryBean.setPlugins(slavePlusInterceptor());
sessionFactoryBean.setVfs(SpringBootVFS.class);
return sessionFactoryBean.getObject();
}
@Bean("slaveTransactionManager")
// 数据源事务管理器
public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "slaveSqlSessionTemplate")
public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean("slaveGlobalConfig")
public GlobalConfig slaveGlobalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
return globalConfig;
}
/**
* 分页插件
*/
@Bean("slavePlusInterceptor")
public MybatisPlusInterceptor slavePlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER));
return interceptor;
}
}
mapper包配置
使用与普通的mybatisPlus一样
注意事项
手动配置多数据源不会配置何解?
直接看mybatisPlus的自动配置
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration#sqlSessionFactory
关联文章:
spring如何管理mybatis的事务
mybatis源码考究二(sqlsession线程安全和缓存失效)
本文为原创,转载请申明