diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml index 2e574380b..ef7e47e78 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml @@ -12,9 +12,17 @@ jeecg-cloud-test-shardingsphere + - org.jeecgframework.boot - jeecg-boot-starter-shardingsphere + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-datasource-spring-boot-starter.version} + + + + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + 5.0.0 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/config/DataSourceConfiguration.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/config/DataSourceConfiguration.java new file mode 100644 index 000000000..3b579e271 --- /dev/null +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/config/DataSourceConfiguration.java @@ -0,0 +1,85 @@ +package org.jeecg.modules.test.sharding.config; + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.creator.DataSourceProperty; +import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; +import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider; +import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +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; + +/** + * 分库分表数据源配置 + * @author zyf + */ +@Configuration +@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class}) +public class DataSourceConfiguration { + /** + * 分表数据源名称 + */ + public static final String SHARDING_DATA_SOURCE_NAME = "sharding"; + /** + * 动态数据源配置项 + */ + @Resource + private DynamicDataSourceProperties dynamicDataSourceProperties; + + @Lazy + @Resource + DataSource shardingDataSource; + + @Lazy + @Resource + DefaultDataSourceCreator dataSourceCreator; + + + /** + * 将shardingDataSource放到了多数据源(dataSourceMap)中 + * 注意有个版本的bug,3.1.1版本 不会进入loadDataSources 方法,这样就一直造成数据源注册失败 + */ + @Bean + public DynamicDataSourceProvider dynamicDataSourceProvider() { + Map datasourceMap = dynamicDataSourceProperties.getDatasource(); + return new AbstractDataSourceProvider(dataSourceCreator) { + @Override + public Map loadDataSources() { + Map 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()); + //v3.5.2 稳定版本 (让默认的DynamicDataSourceProvider优先级为0 by@VonXXGhostin#437) + //dataSource.setProvider(dynamicDataSourceProvider); + dataSource.setP6spy(dynamicDataSourceProperties.getP6spy()); + dataSource.setSeata(dynamicDataSourceProperties.getSeata()); + return dataSource; + } +}