栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot+MyBatisPlus+Seata动态数据源代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot+MyBatisPlus+Seata动态数据源代理

1.依赖

MyBatisPlus多数据源管理的依赖


	com.baomidou
	dynamic-datasource-spring-boot-starter
	3.5.1

2.yml配置
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());
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820309.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号