问题
项目已经使用dynamicdatasource 来按照业务分日常数据的分库和大表通过sharingjdbc来分库,想尽量少改动代码的条件下实现分库逻辑。。
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
@Aspect
@Order(0)
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class DynamicDataSourceAspect {
/** 查询方法名前缀 **/
private final List<String> READ_PREFIX = Arrays.asList("query", "select", "get", "find");
@Around("execution(* com.jj.s*.*.*(..)) "
+ "&& !@annotation(com.baomidou.dynamic.datasource.annotation.DS)")
public Object doAround(ProceedingJoinPoint jp) throws Throwable {
String methodName = jp.getSignature().getName();
Object result=null;
if(isReadMethod(methodName)){
//切换数据源
DynamicDataSourceContextHolder.push(DBTypeEnum.slave.getValue());
result = jp.proceed();
DynamicDataSourceContextHolder.clear();
}else{
result = jp.proceed();
}
return result;
}
public boolean isReadMethod(String methodName){
for(String prefix : READ_PREFIX){
if(methodName.startsWith(prefix)){
return true;
}
}
return false;
}
}