文章目录

暂无目录

记一次分区表查询的实践


2 观看次数
127 字数
0 评论

前情提要:目前项目用的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) {
    }
    
}

再加上一个自定义的注解 实现功能


评论区

还没有人评论

添加新评论