优化记录(9):string.replaceFirst()的优化

在项目迭代中,发现SQL执行慢,经排查不是MyBatis或Spring AOP的问题,而是日志打印的log记录生成耗时,特别是对于长SQL。通过优化`string.replaceFirst()`方法,将原本的实现方式替换为使用数组下标赋值,显著提升了执行效率。
摘要由CSDN通过智能技术生成

一、前提:

在原有的项目中做迭代,发现一个sql执行效率特别慢,总费事16秒时间,触发了生产环境的报警机制。根据获取日志拿到mybatis的动态sql,在本地创建库表,执行效率不到1秒,执行效率并不慢;所以想着是否时sprinAop机制没有写好,导致执行的时候费时间。

排查了aop机制的代码,发现并不是这个问题,而是在记录打印log日志时,生成的log日志慢,因为前面开发人员是从度娘上找的(从网上可以找到),代码没有任何问题,但是当sql长度超过一定时,会存在用时过长问题,这是开发人员没有考虑到的,这里我将该处做了一些优化。

二、问题排查:

2.1、getSql 获取动态sql:

    public static String getSql(Invocation invocation) {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        Object parameter = "";
        if (invocation.getArgs().length > 1) {
            parameter = invocation.getArgs()[1];
        }
        BoundSql boundSql = mappedStatement.getBoundSql(parameter);
        Configuration configuration = mappedStatement.getConfiguration(); 
        Object parameterObject = boundSql.getParameterObject();
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
        if (parameterMappings.size() > 0 && parameterObject != null) {
            TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
            if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
                sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject)));
            } else {
                MetaObject metaObject = c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值