Shardjdbc (4.0.0-rc1版本)整合dynamic(3.5.1)多数据库配置,后台数据库是guassdb主备版+mysql+tdsql多数据源

整体来说,项目本身是springboot,底层是dynamic引入的多数据源配置

这个地方主要是有几个问题需要解决:

1.项目本身继承了 AbstractDataSourceProvider进行自定义数据源配置,这个地方,返回一个map数据源集合:

本身项目引入shardingjdbc是通过jar包和配置文件+分片算法来进行,这个时候,配置文件本身就和shardjdbc的配置产生了冲突,这个地方是通过升级jar包的版本来解决了配置文件冲突的问题,可以让dynamic的多数据源和分片数据源进行正常加载,启动不报错。

2.项目启动成功了,但是数据源本身是没成功使用是分表和算法分片的:

这个地方主数据源是是dynamic里面的配置的,所以即使配置了sharding的数据源,本身是无法使用的,于是这个时候我们去掉sharding的yml配置文件,去掉自动装配,改为手动装配,通过@bean(“shardspheredatasource”),手动装配shardingjdbc的数据源和分片算法,这个地方有个注意事项:就是需要进行分表的表,需要我们手动一个一个重写分配规则和分片算法

3.现在主主数据源改为了sharding的数据源了,这个时候,我们进行实测,发现dynamic配置的多数据源失效了,系统无法访问其他的数据源,只能访问shanging配置的主数据源:

这个地方需要注意的就是,因为dynamic的主数据源被sharding的数据源给替换了,导致其加载的多数据源失效了,那么这个时候,通过主数据源里面的daynamic的配置,@Primary 这个优先注册dynamic的多数据源加载,同时我们在dynamic的AbstractDataSourceProvider自定义数据源装载里面,通过注解

@qualifier(“shardspheredatasource”)获取到我们配置sharding数据源,这个地方,把shard替换掉dynamic的配置的master数据源,在map里面直接put("master",shard),即可替换掉,这个时候,我们就可以使用shard作为主数据源了,并且可以同时使用dynamic配置的多数据源了。

@Bean

@Primary // 如果不添加主数据源标记 spring会忽略掉dynamic的多数据源加载 然后使用默认的sharing 做为主数据源

public DataSource dataSource() {

DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();

dataSource.setPrimary(this.properties.getPrimary());

dataSource.setStrict(this.properties.getStrict());

dataSource.setStrategy(this.properties.getStrategy());

dataSource.setP6spy(this.properties.getP6spy());

dataSource.setSeata(this.properties.getSeata());

return dataSource;

}

4.彩蛋环节:当时我的项目并没有高并发到需要实现分表的环节,于是在主数据源map中,我只是作为shard加入了一个分片数据源,后续可以通过这个代码

@Configuration

public class LastDataSource implements ApplicationListener {

@Resource private DynamicRoutingDataSource dynamicRoutingDataSource; @Resource @Qualifier("shardSphereDataSource") private DataSource shard; @Override public void onApplicationEvent(ApplicationStartedEvent event) { /** * todo 这个时候项目已经加载完成了, 所以可以获取到完整的数据源 这个时候可以进行替换数据源 * 开启这个就可以对信息发送的代码进行更改 进行分表存储 后期数据量大的 如果需要的话可以进行分表存储 不再需要定时任务进行转移 减少表的碎片率 和重复操作行 查询的速度也会加快 */ Map<String,DataSource> stringDataSourceMap = dynamicRoutingDataSource.getDataSources(); stringDataSourceMap.put("master",shard); }

}

代码是注释的,在我们需要使用分片算法的时候,我们可以直接解开注释,把主数据源替换为我们的shard

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值