/**
* Created by hzlizhou on 2017/2/6.
*/
public abstract class MultiDatasourceDao implements IDaoSupport {
private Map<String, SqlSessionTemplate> sqlSessionTemplateMap;
private MultiDataSourceSelector multiDataSourceSelector;
public MultiDatasourceDao(Map<String, SqlSessionTemplate> sqlSessionTemplateMap, MultiDataSourceSelector multiDataSourceSelector) {
this.sqlSessionTemplateMap = sqlSessionTemplateMap;
this.multiDataSourceSelector = multiDataSourceSelector;
}
public Map<String, SqlSessionTemplate> getSqlSessionTemplateMap() {
return sqlSessionTemplateMap;
}
public void setSqlSessionTemplateMap(Map<String, SqlSessionTemplate> sqlSessionTemplateMap) {
this.sqlSessionTemplateMap = sqlSessionTemplateMap;
}
//子类通过这个方法动态获取SqlSessionTemplate
protected SqlSessionTemplate getSqlSessionTemplate() {
String clusterName = multiDataSourceSelector.getName();
SqlSessionTemplate result = sqlSessionTemplateMap.get(clusterName);
Assert.notNull(result);
return result;
}
}
public interface MultiDataSourceSelector {
String getName();
}
public class DubboContextDataSourceSelector implements MultiDataSourceSelector {
private String defaultName;
public DubboContextDataSourceSelector(String defaultName) {
this.defaultName = defaultName;
}
@Override
public String getName() {
//DubboContextHolder 是一个保持一个ThreadLocal的Map
String res = DubboContextHolder.getContext().get(DubboContextConstants.CLUSTER_NAME);
if (res == null) {
res = getDefaultName();
}
return res;
}
public String getDefaultName() {
return defaultName;
}
}
@Documented
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface DynamicTransactional {
Propagation propagation() default Propagation.REQUIRED;
Class<? extends Throwable>[] rollbackFor() default {};
}
private Object invokeWithinTransaction(final ProceedingJoinPoint pjp, final DynamicTransactional dynamicTransaction) {
//创建TransactionTemplate
final PlatformTransactionManager tran = multiTransactionManagerHolder.getTransactionManager();
TransactionTemplate transactionTemplate = new TransactionTemplate();
transactionTemplate.setPropagationBehavior(dynamicTransaction.propagation().value());
transactionTemplate.setTransactionManager(tran);
//在事务中执行
return transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus status) {
Object result = null;
try {
result = pjp.proceed();
} catch (Throwable throwable) {
Class<? extends Throwable>[] c = dynamicTransaction.rollbackFor();
for (Class<? extends Throwable> tmp : c) {
if (tmp.isAssignableFrom(throwable.getClass())) {
status.setRollbackOnly();
}
}
}
return result;
}
});
}
<aop:config>
<aop:aspect id="multiTransactionManagerAspect" ref="multiTransactionManagerAop">
<aop:around method="invokeWithinTransaction"
arg-names="dynamicTransaction"
pointcut="@annotation(dynamicTransaction)"/>
</aop:aspect>
</aop:config>
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有