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

mybatis-plus整合多数据源(读写分离)

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

mybatis-plus整合多数据源(读写分离)

1.首先pom文件


    mysql
    mysql-connector-java


    com.baomidou
    mybatis-plus-boot-starter


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

2.数据源公用类

import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.stereotype.Component;


@Component
@Data
public class DatasourceBuilder {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    
    public DruidDataSource createDruidDataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setDriverClassName(driverClassName);
        datasource.setUrl(url);
        datasource.setUsername(username);
        datasource.setPassword(password);
        return datasource;
    }


}

3.

@Configuration
@ConfigurationProperties(prefix = "spring.read.one")
public class ReadoneDataSourceBuilder extends DatasourceBuilder {

}


@Configuration
@ConfigurationProperties(prefix = "spring.write.datasource")
public class WriteDataSourceBuilder extends DatasourceBuilder {
}

4.配置多数据源


@Configuration
public class DruidConfiguration {
    @Autowired
    private MyMybatisProperties mybatisProperties;

    
    @Autowired
    private WriteDataSourceBuilder writeDataSourceBuilder;
    
    @Autowired
    private ReadoneDataSourceBuilder readOneDataSourceBuilder;
    
    @Autowired
    private DataSourceConfigBuilder dataSourceConfigBuilder;

    
    @Bean(name = "writeDataSource")
    @Primary
    public DataSource writeDataSource() {
        DruidDataSource dataSource = writeDataSourceBuilder.createDruidDataSource();
        return dataSourceConfigBuilder.config(dataSource);
    }

    
    @Bean(name = "readDataSourceOne")
    public DataSource readDataSourceOne() {
        DruidDataSource dataSource = readOneDataSourceBuilder.createDruidDataSource();
        return dataSourceConfigBuilder.config(dataSource);
    }

    
    @Bean("readDataSources")
    public List readDataSources() {
        List dataSources = new ArrayList();
        dataSources.add(readDataSourceOne());
        return dataSources;
    }

    @Bean
    public RoutingDataSource dynamicDataSource() {
        return new RoutingDataSource(writeDataSource(),readDataSources());
    }

    
    @Bean
    @ConditionalOnMissingBean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources(mybatisProperties.getMapperLocations());
        // 解决myBatis下 不能嵌套jar文件的问题
        VFS.addImplClass(SpringBootVFS.class);
        MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
        factory.setDataSource(dynamicDataSource());
        factory.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());
        factory.setMapperLocations(resources);
        SqlSessionFactory sqlSessionFactory =  factory.getObject();
        if (sqlSessionFactory != null) {
            sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
        }
        return sqlSessionFactory;
    }

    
    @Bean
    public DataSourceTransactionManager transactionManager(AbstractRoutingDataSource source) {
        return new DataSourceTransactionManager(source);
    }

5.AOP加本地线程变量

@Aspect
@Component
@Slf4j
@Order(0)
public class DatasourceAop {
    
    private final String[] readSuffix = {"read", "get", "find", "search"};

    
    @Before("execution(* com.tvunetworks.invoice.service..*.*(..))")
    public void switchDataSourceType(final JoinPoint joinPoint) {
        //判断是否是Transactional方法
        if (joinPoint.getSignature() instanceof MethodSignature) {
            Method method = ((MethodSignature) joinPoint
                    .getSignature()).getMethod();
            if (method.isAnnotationPresent(Transactional.class)) {
                DynamicDataSourceContextHolder.push(DataSourceType.write.getType());
                return;
            }
        }
        for (String read : readSuffix) {
            String name = joinPoint.getSignature().getName().toLowerCase();
            if (name.startsWith(read)) {
                log.debug("dataSource switch to: Read");
                DynamicDataSourceContextHolder.push(DataSourceType.read.getType());
                return;
            }
        }
        log.debug("dataSource switch to: Write");
        DynamicDataSourceContextHolder.push(DataSourceType.write.getType());
    }

}




public class DataSourceContextHolder {

	private static final ThreadLocal LOCAL = new ThreadLocal();

	public static ThreadLocal getLocal() {
		return LOCAL;
	}

	
	public static void read() {
		LOCAL.set(DataSourceType.read.getType());
	}

	
	public static void write() {
		LOCAL.set(DataSourceType.write.getType());
	}

	
	public static String getJdbcType() {
		String s = LOCAL.get();
		LOCAL.remove();
		return s;
	}
}


切换数据源

public class RoutingDataSource extends AbstractRoutingDataSource {
    
    private final int readSize;
    
    private final AtomicInteger count=new AtomicInteger(0);

    public RoutingDataSource(DataSource defaultTargetDataSource, List targetDataSources){
        Map dataSourceMap = new HashMap<>(2);
        dataSourceMap.put(DataSourceType.write.getType(),defaultTargetDataSource);
        this.setDefaultTargetDataSource(defaultTargetDataSource);
        readSize= targetDataSources.size();
        for (int i = 0; i  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270997.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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