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>