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