AbstractRoutingDataSource spring数据源读写分离

1.spring 提供了动态接入数据源接口 ,靠AbstractRoutingDataSource抽象类来实现。下面来介绍下原理。

2.先看下项目配置文件(配置读写分离)

	<!--master_dataSource为主数据源 ,slave_dataSource为从数据源,DynamicDataSource为继承AbstractRoutingDataSource 的自定义实现类(用来选择数据源)-->
	<bean id="dataSource"
		class="com.xxx.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry key="read" value-ref="slave_dataSource" />
			</map>
		</property>
		<!-- 默认数据源指定为业务数据源即可 -->
		<property name="defaultTargetDataSource" ref="master_dataSource" />
	</bean>

/***
 * 动态 选择 数据源
 * 
 * @author HadLuo
 * @since JDK1.7
 * @history 2019年6月14日 新建
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 获取与数据源相关的key 此key是Map<String,DataSource> resolvedDataSources 中与数据源绑定的key值
     * 在通过determineTargetDataSource获取目标数据源时使用
     */
    @Override
    protected Object determineCurrentLookupKey() {
    	//动态选择哪个数据源
        return HandleDataSource.getDataSource();
    }
}

下面对照AbstractRoutingDataSource 源码来分析配置

下图为AbstractRoutingDataSource 类成员截图:
在这里插入图片描述
defaultTargetDataSource为 上面xml配置默认主数据源,spring解析xml文件时就赋值好了。
targetDataSources变量为多个从数据源,为map对象,里面值为:
key:read字符串
value:slave_dataSource

下图为AbstractRoutingDataSource 类成员方法截图:
在这里插入图片描述
spring加载bean会自动调用afterPropertiesSet方法,里面逻辑主要2步:
1.将targetDataSources值拷贝到resolvedDataSources成员变量。
2.执行resolveSpecifiedDataSource成员方法,将defaultTargetDataSource复制到 resolvedDefaultDataSource
在这里插入图片描述
直接返回数据源。

到此我们成员的值情况:
1.targetDataSources
key:read字符串
value:slave_dataSource
2.resolvedDataSources
key:read字符串
value:slave_dataSource
3.defaultTargetDataSource
master_dataSource
4.resolvedDefaultDataSource
master_dataSource

下图为AbstractRoutingDataSource 类成员方法截图:
在这里插入图片描述
spring获取数据库连接时会调用getConnection方法,是javax.sql.DataSource的接口方法实现类(数据库规范)。
在这里插入图片描述
determineTargetDataSource方法作用就是回调前面自定义com.xxx.DynamicDataSource类的determineCurrentLookupKey方法。

    protected Object determineCurrentLookupKey() {
    	//这里我们返回一个字符串,read,就代表了走 slave_dataSource数据源
        return HandleDataSource.getDataSource();
    }

返回数据源之后,就调用数据源的getConnection对象去连接啦。。。

自此,spring如何选择数据源的就讲到这里了,谢谢大家观看。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400 表演视频实例https://v.qq.com/x/page/f0517awx0x4.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值