问题
项目已经使用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;
}
}```