跳到主要内容
版本:4.5.0

自动读写分离

场景:

  1. 在纯的读写分离环境,写操作全部是 master,读操作全部是 slave。
  2. 不想通过注解配置完成以上功能。

答:在 mybatis 环境下可以基于 mybatis 插件结合本数据源完成以上功能。

手动注入插件。

@Bean
public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){
return new MasterSlaveAutoRoutingPlugin();
}

默认主库名称 master,从库名称 slave。

暂不支持更多,源码简单可参考重写。

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
@Slf4j
public class MasterSlaveAutoRoutingPlugin implements Interceptor {

private static final String MASTER = "master";

private static final String SLAVE = "slave";

@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
MappedStatement ms = (MappedStatement) args[0];
try {
DynamicDataSourceContextHolder.push(SqlCommandType.SELECT == ms.getSqlCommandType() ? SLAVE : MASTER);
return invocation.proceed();
} finally {
DynamicDataSourceContextHolder.clear();
}
}

@Override
public Object plugin(Object target) {
return target instanceof Executor ? Plugin.wrap(target, this) : target;
}

@Override
public void setProperties(Properties properties) {
}
}