动态数据源整合sharingjdbc

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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.context.support.AbstractApplicationContext;

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

/**
 * @author wangjunbao
 * @title CustomDataSourceConfig
 * @description
 * @create 2023/8/28 18:42
 */
@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, ShardingSphereAutoConfiguration.class})
@Slf4j
public class CustomDataSourceConfig {

    public static final String SHARDING_DATA_SOURCE = "sharding_data_source";

    @Autowired
    AbstractApplicationContext context;
    @Autowired
    private DynamicDataSourceProperties properties;

    @Lazy
    @Resource
    private DataSource shardingDataSource;
    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
                dataSourceMap.put(SHARDING_DATA_SOURCE, shardingDataSource);
                return dataSourceMap;
            }
        };
    }

    @Primary
    @Bean
    public DataSource dataSource() {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        String primary = StringUtils.equals( "true", this.context.getEnvironment().getProperty("spring.shardingsphere.enabled"))
                ? SHARDING_DATA_SOURCE : properties.getPrimary();
        dataSource.setPrimary(primary);
        log.info("Custom Datasource primary: {}", primary);
        return dataSource;
    }
}

配置:

server:
  port: 8012
#  servlet:
#    encoding:
#      charset: UTF-8
#      force: true
#      enabled: true

spring:
#  profiles:
#    active: dev
  application:

  # 多数据源配置
  datasource:
#    url:  url
#    username: username
#    password: password
#    driver-class-name:  com.mysql.cj.jdbc.Driver
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: url
          username: username
          password: password
          driver-class-name: com.mysql.jdbc.Driver
        slave_1:
          url: url
          username: username
          password: password
          driver-class-name: com.mysql.jdbc.Driver
  #  main:
#    allow-bean-definition-overriding: true
  shardingsphere:
    mode:
      type: Memory
    datasource:
      names: ds0
      ds0: #对应每个数据源的配置
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: url
        username: username
        password: password
    rules:
      sharding:
        tables:
          Teacher:
            actual-data-nodes: ds0.Teacher_$->{2023..2033}
            table-strategy:
              standard:
                sharding-column: createTime
                sharding-algorithm-name: teacher-inline

        sharding-algorithms:
          teacher-inline:
            type: CLASS_BASED
            props: # 算法参数,可以在下面自定义自己的参数,获取时通过自定义算法中的props对象获取。参数值仅支持字符串和数字,不支持对象、map等参数,对于map等参数可以按照字符串形式传入程序,然后通过JSON工具反序列化。
              strategy: STANDARD # 我们实现的是StandardShardingAlgorithm接口,因此属于standard策略
              # 自定义算法全限定类名
              algorithmClassName: com.xxx.xxx.xxx.xxx.shardingjdbc.CustomShardingAlgorithm
              allow-range-query-with-inline-sharding: true
    props:
      sql-show: true



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值