spring动态切换数据源

1  主要解决的问题, 事务配置在service 层 数据源切换 要在 service 事务执行之前

第一步:编写动态数据源

public class DynamicDataSource extends AbstractRoutingDataSource {

	@Override
	protected Object determineCurrentLookupKey() {
		DBType key = ContextHolder.getDbType();//获得当前数据源标识符
		return key;
	}
}


二步:配置spring 动态数据源

<!-- 动态数据源设置 -->
	<bean id="dynamicDataSource" class="com.gpact.startup.database.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="com.gpact.startup.database.DBType">
				<entry key="gpallas" value-ref="dataSourceGpallas"></entry>
				<entry key="gpms" value-ref="dataSourceGpms" />
				<entry key="GPMS001" value-ref="dataSourceGPMS001" />
				<entry key="GPMSPact" value-ref="dataSourceGPMSPact" />
				<entry key="gPallasLog" value-ref="dataSourceGpallasLog" />
			</map>
		</property>
		<property name="defaultTargetDataSource" ref="dataSourceGpallas" />
	</bean>


三步:编写数据源拦截

	public void setdataSourceCommom(JoinPoint jp){
		 try {
			String classType = jp.getTarget().getClass().getName();  
			    Class<?> clazz = Class.forName(classType);  
			    String clazzName = clazz.getName();  
			    if(clazzName.indexOf("com.gpact.core.gpallaslog")!=-1){
			    	setdataSourceGPallasLog(jp);
			    }else if(clazzName.indexOf("com.gpact.core.gpmspact")!=-1){  
			    	setdataSourceGPMSPact(jp); 
			    }else if(clazzName.indexOf("com.gpact.core.gpms001")!=-1){
			    	setdataSourceGPMS001(jp);
			    }else if(clazzName.indexOf("com.gpact.core.gpms")!=-1){  
			    	setdataSourceGpms(jp); 
			    }else{
			    	setdataSourceGpallas(jp);
			    }
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			setdataSourceGpallas(jp);
		}  
	}


第四步: 配置service事务在动态切换数据源后面

	<aop:config>
		<aop:pointcut expression="execution(* com.gpact.core.*.service.*.*(..))"
			id="perform" />
		<aop:advisor pointcut-ref="perform" advice-ref="txManager" order="2" />
		<aop:aspect id="dataSourceAspect" ref="dataSourceInterceptor" order="1" >
			<aop:pointcut id="dsCommom" 
				expression="execution(* com.gpact.core.common.service.*.*(..))" />
			<aop:pointcut id="dsGpallas"
				expression="execution(* com.gpact.core.gpallas.service.*.*(..)) " />
			<aop:pointcut id="dsGpms"
				expression="execution(* com.gpact.core.gpms.service.*.*(..))" />
			<aop:pointcut id="dsGPMS001"
				expression="execution(* com.gpact.core.gpms001.service.*.*(..))" />
			<aop:pointcut id="dsGPMSPact"
				expression="execution(* com.gpact.core.gpmspact.service.*.*(..))" />
			<aop:pointcut id="dsGpallasLog"
				expression="execution(* com.gpact.core.gpallaslog.service.*.*(..))" />

			<aop:before method="setdataSourceCommom" pointcut-ref="dsCommom" />
			<aop:before method="setdataSourceGpallas" pointcut-ref="dsGpallas" />
			<aop:before method="setdataSourceGpms" pointcut-ref="dsGpms" />
			<aop:before method="setdataSourceGPMS001" pointcut-ref="dsGPMS001" />
			<aop:before method="setdataSourceGPMSPact" pointcut-ref="dsGPMSPact" />
			<aop:before method="setdataSourceGPallasLog" pointcut-ref="dsGpallasLog" />
		</aop:aspect>
	</aop:config>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值