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