shardingjdbc增加动态数据源(用于解决其不支持的SQL等)

1.配置文件

spring: 
    #动态数据源引入
    dynamic:
      strict: true
      datasource:
        ds:
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
          url: ${secret.datasource.url}
          username: ${secret.datasource.username}
          password: ${secret.datasource.password}

2. 动态数据源JAR,小编这里用的3.5.1,根据MP版本保持一致

       <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
                <version>${mybatisplus.version}</version>
            </dependency>

3. 配置类

package com.haicloud.config;

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Map;

@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class})

public class DataSourceConfiguration {
    /**
     * 分表数据源名称
     */
    public static final String SHARDING_DATA_SOURCE_NAME = "master";
    /**
     * 动态数据源配置项
     */
    @Autowired
    private DynamicDataSourceProperties dynamicDataSourceProperties;
    
    @Lazy
    @Resource
    DataSource shardingDataSource;

    /**
     * 将shardingDataSource放到了多数据源(dataSourceMap)中
     * 注意有个版本的bug,3.1.1版本 不会进入loadDataSources 方法,这样就一直造成数据源注册失败
     */
    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = dynamicDataSourceProperties.getDatasource();
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
                // 将 shardingjdbc 管理的数据源也交给动态数据源管理
                dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource);
                return dataSourceMap;
            }
        };
    }

    /**
     * 将动态数据源设置为首选的
     * 当spring存在多个数据源时, 自动注入的是首选的对象
     * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
     *
     * @return
     */
    @Primary
    @Bean
    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(dynamicDataSourceProperties.getPrimary());
        dataSource.setStrict(dynamicDataSourceProperties.getStrict());
        dataSource.setStrategy(dynamicDataSourceProperties.getStrategy());
//        dataSource.setProvider(dynamicDataSourceProvider);
        dataSource.setP6spy(dynamicDataSourceProperties.getP6spy());
        dataSource.setSeata(dynamicDataSourceProperties.getSeata());
        return dataSource;
    }
}

4.使用方法:

使用方法:
Mapper、service、controller使用的class或者接口上贴指定数据源
    @DS("ds")

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Sharding-JDBC 是一个开源的分库分表中间件,它提供了数据源动态加载功能。下面是 Sharding-JDBC 数据源加载的流程: 1. 加载配置文件:首先,Sharding-JDBC 会读取配置文件,一般是通过 Spring 或者 Spring Boot 进行配置。配置文件中包含了数据源的相关信息,比如数据源类型、分库分表规则等。 2. 解析配置文件:Sharding-JDBC 会解析配置文件,将配置信息转换为内部的数据结构,比如解析数据源类型、解析分库分表规则等。 3. 初始化数据源:根据配置文件中的数据源信息,Sharding-JDBC 会初始化对应的数据源,如读写分离数据源、分布式数据源等。这里会根据配置的数据源类型进行相应的初始化操作。 4. 初始化分库分表规则:根据配置文件中的分库分表规则,Sharding-JDBC 会初始化对应的分库分表规则。这些规则定义了数据如何划分到不同的库表中。 5. 加载数据源路由:Sharding-JDBC 会根据分库分表规则和数据源信息,构建数据源路由对象。数据源路由对象负责将 SQL 解析为对应的数据源和表。 6. 加载 SQL 解析器:Sharding-JDBC 会加载 SQL 解析器,用于解析 SQL 并生成对应的执行计划。 7. 加载执行引擎:Sharding-JDBC 会加载执行引擎,用于执行 SQL 执行计划,并将结果返回给应用程序。 通过以上步骤,Sharding-JDBC 完成了数据源的加载,应用程序可以通过 Sharding-JDBC 进行数据的访问和操作。需要注意的是,具体的加载流程可能会根据不同的版本和配置有所差异,上述流程仅为一般情况下的示意。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YJ_Root

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值