背景: 目前基于连接了mobile库 从库的 项目(spring+mybatis), 需要将从库配置调整为多个直连数据源,? 即 配置多个从库的需要
下面以配置两个mobile从库数据源为例,进行配置示例:
数据源配置文件appContext-jdbc.xml
class="java">
destroy-method="close">
value="jdbc:mysql://${jdbc.mobile.host}:${jdbc.mobile.port}/${jdbc.mobile.dbname}?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true" />
destroy-method="close">
value="jdbc:mysql://${jdbc.mobile.host}:${jdbc.mobile.port}/${jdbc.mobile.dbname}?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true" />
destroy-method="close">
value="jdbc:mysql://${jdbc.write.mobile.host}:${jdbc.write.mobile.port}/${jdbc.write.mobile.dbname}?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true" />
2.? 动态数据源工具类?com.yy.sv.base.db.dynamic.DynamicRoutingDataSource
使用该工具类需要依赖jar
com.yy.cs
sv-base
1.2.1
DynamicRoutingDataSource内部实现了多个数据源间的负载均衡机制(从数据源的bean id名并不作为均衡机制中的key,可以随意命名),想了解的可以读下源码
3.? 基于目前默认连接的是从库的配置, 业务代码在需要切换至主库进行写操作时,代码如下:
@Override
public Set checkReidsInStore(List resids) {
? ?DynamicRoutingDataSourceHolder.useMaster();//切换至主库
? ?Set residSet = shenquStoreMapper.checkResidsExist(resids);
? ?DynamicRoutingDataSourceHolder.reset();//切换至默认连接从库
? ?return residSet;
}
4. 之前代码中已经使用了如下代码的可以这样切换:
@Override
public Set checkReidsInStore(List resids) {
? DynamicDataSourceHolder.setDataSourceKey(Constants.MOBILE_DATA_SOURCE_SPRING_BEAD_ID, Constants.WRITE_DATA_SOURCE);
? Set residSet = shenquStoreMapper.checkResidsExist(resids);
? DynamicDataSourceHolder.clearDataSourceMapKey();
return residSet;
}
将DynamicDataSourceHolder的setDataSourceKey以及clearDataSourceMapKey方法的实现调整为:
public static void setDataSourceKey(String dataSource,String dataSourceKey) {
? DynamicRoutingDataSourceHolder.useMaster();//基于目前默认连从库,切换至主库才需要手动设置dataSourceKey
}
public static void clearDataSourceMapKey() {
? DynamicRoutingDataSourceHolder.reset();
}
这样业务代码中进行主从切换的代码就不需要改动, 减少改动和入侵
5. 如果项目中没有使用到写主库数据源, 那么可以这样配置(紫色部分),因为没有进行过主从切换, 所以用从库数据源顶替主写数据源: