java多数据源自动切花

读写分离实现方式上主要分为两种:

一种是通过中间件,中间件方式实现比较复杂,技术要求比较高

一种是代码实现,改方式比较简单,只是在不同的项目都要重复实现

下面介绍代码实现读写分离的几种实现方式,项目是以spring boot 2.1.3版本实现, 不同的版本,配置的属性会有细微的差别! 项目功能描述

目前很多网站都拥有大量用户,而且很多用户同事操作。

一般写数据的性能比较低,而且写操作相对读是比较少的,大部分的操作都是读。

因此,项目的架构应该将读和写操作区分开来,保证读操作的性能来提高用户体验。

该项目主要是通过3种不同的方式来实现数据库的读写分离。 项目结构

--dynamic-ds-demo   --父项目, 管理依赖的jar

--rw-mapper        --子项目,通过映射不同的mapper文件实现读写分离

--rw-annotation     --子项目,通过手动指定注解的方法实现读写分离

--rw-interceptor     --子项目,通过mybatis插件实现读写分离 读写分离的实现方式之一

rw-mapper 实现步骤

一:读和写的操作,分别用不同的mapper接口文件,以及各自对应不同mapper.xml文件

二:分别配置读和写的数据源,然后在数据源配置类里面配置扫描的mapper接口路径,以及mapper.xml的路径

结论:

该方式需要将读操作和写操作放到不同的mapper文件,现实中我们一般都是按某个操作类型来区分的,所以该方式的控制粒度太粗,而且不灵活,不建议使用

(注意:需要数据源需要区分主从,也就是需要有一个用@primary注解标识的数据源)

读写分离的实现方式之二

rw-annotation 实现步骤

一:通过spring提供的AbstractRoutingDataSource来手动配置数据源

二:通过自定义注解手动设置数据源

三:通过注解切面,将指定的数据源设置到ThreadLocal

结论

该方式可以手动控制哪些方法操作哪个数据库,但是只能在方法级别的实行读写分离,粒度不够精细,不能控制到具体的增删改查方法上面。可以在某些只会操作从库的项目上面使用。

(注意:该方式需要排除spring boot的数据库自动配置,否则会有循环依赖问题,@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ) 读写分离的实现方式之三

rw-interceptor 实现步骤

一:通过spring提供的AbstractRoutingDataSource配置数据源

二:实现mybatis的Interceptor拦截器,根据业务方法将数据源设置到ThreadLocal

三:蒋ThreadLocal变量的值赋值到AbstractRoutingDataSource提供的determineCurrentLookupKey

结论:

该方式是以mybatis插件提供读写分离,可以根据数据库执行的方法来设置数据源,从而实现增删改操作操作主库, 读操作操作从库,而且没有侵入性,推荐使用这种方法实现读写分离

代码地址:github.com/yubingzhang…

(注意:需要使用mybatis orm框架)

转载于:https://juejin.im/post/5cb41d936fb9a068ad1b10ee

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值