美文网首页
SpringBoot多数据源开发(使用多个数据库)

SpringBoot多数据源开发(使用多个数据库)

作者: 小名源治 | 来源:发表于2022-08-29 17:37 被阅读0次

在开发过程中,会遇到多数据库的情况,那就需要使用该注解来实现:@DataSource(value = DataSourceType.SLAVE)
这样可以灵活的切换使用数据库。

在需要切换数据源的service或者mapper上添加此注解。

@DataSource(value = DataSourceType.SLAVE)
//@DataSource(value = DataSourceType.MASTER)
public List<...> select(...)
{
    return mapper.select(...);
}

其中value用来表示数据源名称,除MASTERSLAVE其他均需要进行配置。

1.配置yml文件

需要添加从数据库

spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url:
                username: 
                password: 
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: true
                url: 
                username: 
                password: 

2.添加数据源枚举

/**
 * 数据源
 * 
 */
public enum DataSourceType
{
    /**
     * 主库
     */
    MASTER,

    /**
     * 从库
     */
    SLAVE
}

3.创建配置类读取数据库源

/**
 * druid 配置多数据源
 * 
 */
@Configuration
public class DruidConfig
{
//主数据库
    @Bean
    @ConfigurationProperties("spring.datasource.druid.master")
    public DataSource masterDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

//从数据库
    @Bean
    @ConfigurationProperties("spring.datasource.druid.slave")
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
    public DataSource slaveDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

   @Bean(name = "dynamicDataSource")
    @Primary
    public DynamicDataSource dataSource(DataSource masterDataSource)
    {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
        return new DynamicDataSource(masterDataSource, targetDataSources);
    }

    /**
     * 设置数据源(添加备用数据源)
     * 
     * @param targetDataSources 备选数据源集合
     * @param sourceName 数据源名称
     * @param beanName bean名称
     */
    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
    {
        try
        {
           //通过名字得到注册的Bean实例(就是上面添加的从数据库)
            DataSource dataSource = SpringUtils.getBean(beanName);
            targetDataSources.put(sourceName, dataSource);
        }
        catch (Exception e)
        {
        }
    }
}

4.在需要使用多数据源方法或类上添加@DataSource注解,其中value用来表示数据源

@DataSource(value = DataSourceType.SLAVE)
public List<SysUser> selectUserList(SysUser user)
{
    return userMapper.selectUserList(user);
}

参考来源:http://ruoyi.vip/

相关文章

网友评论

      本文标题:SpringBoot多数据源开发(使用多个数据库)

      本文链接:https://www.haomeiwen.com/subject/qwolnrtx.html