MyBatisPlus多数据源管理的依赖
2.yml配置com.baomidou dynamic-datasource-spring-boot-starter 3.5.1
spring:
datasource:
datasource1:
url: jdbc:mysql://localhost:3306/database01?rewriteBatchedStatements=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
username: root
password: admin
datasource2:
url: jdbc:mysql://localhost:3306/database02?rewriteBatchedStatements=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
username: root
password: admin
如有黄色警告,忽略即可。
3.DataSourceConfiguration 数据源代理配置类package system.config.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import io.seata.rm.datasource.DataSourceProxy;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.annotation.Resource;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfiguration {
@Resource
private MetaObjectHandler metaObjectHandler;
@Resource
private MybatisPlusInterceptor mybatisPlusInterceptor;
@Bean("originalDatasource1")
@ConfigurationProperties(prefix = "spring.datasource.datasource1")
public DataSource dataSource2() {
return new DruidDataSource();
}
@Bean("originalDatasource2")
@ConfigurationProperties(prefix = "spring.datasource.datasource2")
public DataSource dataSource1() {
return new DruidDataSource();
}
@Primary
@Bean("datasource1")
public DataSourceProxy dataSourceProxySatisfactory(@Qualifier("originalDatasource1") DataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
@Bean("datasource2")
public DataSourceProxy dataSourceProxyMysql(@Qualifier("originalDatasource2") DataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
@Bean("dynamicDataSource")
public DataSource dynamicDataSource(@Qualifier("datasource1") DataSourceProxy datasource1, @Qualifier("datasource2") DataSourceProxy datasource2) {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
dynamicRoutingDataSource.addDataSource("name1", datasource1);
dynamicRoutingDataSource.addDataSource("name2", datasource2);
dynamicRoutingDataSource.setPrimary("name1");
dynamicRoutingDataSource.setSeata(true);
return dynamicRoutingDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dataSource) throws Exception {
// 这里用 MybatisSqlSessionFactoryBean 代替了 SqlSessionFactoryBean,否则 MyBatisPlus 不会生效
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
mybatisSqlSessionFactoryBean.setDataSource(dataSource);
mybatisSqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:system/mapper/xml
@Service
@DS("datasource1")
public class MysqlSlowLogServiceImpl extends ServiceImpl implements MysqlSlowLogService {
@Resource
private MysqlSlowLogMapper mapper;
@Override
public Page pageSlowLog(PaginationRequest paginationRequest) {
return page(paginationRequest.buildPage(), paginationRequest.buildQueryWrapper());
}
}
方法二:用 DynamicDataSourceContextHolder.push() 手动切换数据源
@Override
@DS("dev")
public void getCopyDataInfo(String targetTableName, Long serverId, String dbName, Long taskSetId) {
GetCopyDataInfoVO info = getCopyDataInfoOne(targetTableName, serverId, dbName, taskSetId);
// 手动切换数据源
DynamicDataSourceContextHolder.push("master");
saveCopyDataInfo(info.getSyncInfo(), info.getTaskSetId(), info.getSrTableInfo(), info.getTgtTableInfo(), info.getSrColInfoList(), info.getTgtColInfoList());
}



