前情提要:目前项目用的PgSql,订单库所有生产数据都会同步到汇聚库(kettle实现),导致目前汇聚库数据量巨大(目前主单亿级数据)
所以就用上了PgSql的表分区(分区因子是数据的创建时间),项目Dao用的是Mybatis,so我得根据业务的相关条件指定查询走哪一个或者哪几个表分区.
那就直接上Mybatis的拦截器
@Intercepts( { @Signature(
type = StatementHandler.class,
method = "prepare",
args = { Connection.class,Integer.class })})
public class SubTablePlugin implements Interceptor {
private Logger logger = LoggerFactory.getLogger(getClass());
public static final String DELEGATE = "delegate";
public static final String MAPPED_STATEMENT = "mappedStatement";
@Override
public Object intercept(Invocation ivk) throws Throwable {
if(ivk.getTarget().getClass().isAssignableFrom(RoutingStatementHandler.class)) {
final RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk.getTarget();
final BaseStatementHandler delegate = (BaseStatementHandler) Reflections.getFieldValue(statementHandler, DELEGATE);
final MappedStatement mappedStatement = (MappedStatement) Reflections.getFieldValue(delegate, MAPPED_STATEMENT);
final BoundSql boundSql = statementHandler.getBoundSql();
String sql = SqlConverterFactory.getGlobalInstance().convert(boundSql, mappedStatement);
if(StringUtils.isNotBlank(sql)) {
logger.debug("[Modified sql] " + sql);
Reflections.setFieldValue(statementHandler.getBoundSql(), "sql", sql);
}
}
return ivk.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}再加上一个自定义的注解 实现功能
评论区
还没有人评论