POM依赖:
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc-core-spring-boot-starter --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>5.2.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.6.1</version> </dependency>
修改ShardingSphereDataSource初始化配置:
package cn.com.joycode.linglong.data.core.config; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.annotation.Master; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory; import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource; import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlModeConfigurationSwapper; import org.apache.shardingsphere.spring.boot.datasource.DataSourceMapSetter; import org.apache.shardingsphere.spring.boot.prop.SpringBootPropertiesConfiguration; import org.apache.shardingsphere.spring.boot.rule.LocalRulesCondition; import org.apache.shardingsphere.spring.boot.schema.DatabaseNameSetter; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import javax.sql.DataSource; import java.sql.SQLException; import java.util.*; @Configuration @ComponentScan("org.apache.shardingsphere.spring.boot.converter") @EnableConfigurationProperties(SpringBootPropertiesConfiguration.class) @AutoConfigureAfter(LingLongDynamicDataSourceConfiguration.class) @RequiredArgsConstructor public class LingLongShardingSphereDataSourceConfiguration implements EnvironmentAware, ApplicationContextAware { private ApplicationContext applicationContext; private final SpringBootPropertiesConfiguration props; private final Map<String, DataSource> dataSourceMap = new LinkedHashMap<>(); private String databaseName; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext=applicationContext; } @Bean public ModeConfiguration modeConfiguration() { return null == this.props.getMode() ? null : (new YamlModeConfigurationSwapper()).swapToObject(this.props.getMode()); } @Bean @Conditional(LocalRulesCondition.class) @Autowired(required = false) public ShardingSphereDataSource localRulesCondition(final ObjectProvider<List<RuleConfiguration>> rules, final ObjectProvider<ModeConfiguration> modeConfig) throws SQLException { Collection<RuleConfiguration> ruleConfigs = Optional.ofNullable(rules.getIfAvailable()).orElseGet(Collections::emptyList); DataSource dataSource = ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig.getIfAvailable(), dataSourceMap, ruleConfigs, props.getProps()); DynamicRoutingDataSource dynamicRoutingDataSource= applicationContext.getBean(DynamicRoutingDataSource.class); if(ObjectUtil.isNotNull(dynamicRoutingDataSource)) { dynamicRoutingDataSource.addDataSource("sharding", dataSource); } return (ShardingSphereDataSource) dataSource; } @Bean @ConditionalOnClass(ModeConfiguration.class) public ShardingSphereDataSource modeConfig(final ModeConfiguration modeConfig) throws SQLException { DataSource dataSource = !dataSourceMap.isEmpty() ? ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig, dataSourceMap, Collections.emptyList(), props.getProps()) : ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig); DynamicRoutingDataSource dynamicRoutingDataSource= applicationContext.getBean(DynamicRoutingDataSource.class); if(ObjectUtil.isNotNull(dynamicRoutingDataSource)) { dynamicRoutingDataSource.addDataSource("sharding", dataSource); } return (ShardingSphereDataSource) dataSource; } @Override public final void setEnvironment(final Environment environment) { dataSourceMap.putAll(DataSourceMapSetter.getDataSourceMap(environment)); databaseName = DatabaseNameSetter.getDatabaseName(environment); } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END