记录一次bug解决过程:可维护性和性能优化

一、总结

  1. 使用某些变量的地方在2次以上的,强烈建议使用枚举值来维护变量,日后方便扩展。
  2. 查数据库的方法调用,能合并就净量去合并。

二、Bug描述

枚举变量的维护以及方法使用:

public class UsedOnce {
    public static enum ruleDetailsEnum {
        SOURCEREGIN("原区域"), TARGETREGIN("目的区域"), SOURCECITY("原城市"), TARGETCITY("目的城市"), SOURCESITE("原机房"),
        TARGETSITE("目的机房"), DEVICETYPE("设备类型");
        private final String strValue;
        private ruleDetailsEnum(String strValue){
            this.strValue = strValue;
        }
        public String getStrValue() {
            return strValue;
        }
        public static String getStrValueByName(String name) {
            for (ruleDetailsEnum orderDeviceType : ruleDetailsEnum.values()) {
                if (name.equals(orderDeviceType.name())) {
                    return orderDeviceType.getStrValue();
                }
            }
            return null;
        }
    }

    public static void main(String[] args) {
        UsedOnce.ruleDetailsEnum e = UsedOnce.ruleDetailsEnum.valueOf("DEVICETYPE");
        switch (e.ordinal()) {
            case 0:
                System.out.println("原区域");
                break;
            case 6:
                System.out.println("设备类型");
                break;
            default:
                System.out.println("没有匹配到");
        }
    }
}
// 结果输出:设备类型

查询数据库合并性能优化:

JVM堆中缓存当天的数据性能优化:

private Map<String, String> getAssignRates() {
    Date start = DateUtil.removeDays(new Date(), 1);
    String startTm = DateUtil.toString(start, DateUtil.DATE_FORMAT);
    String endTm = DateUtil.toString(DateUtil.removeDays(start, 90), DateUtil.DATE_FORMAT);
    List<LogisticsAtomic> list = new ArrayList<LogisticsAtomic>();

    /* 缓存入JVM堆中;减少哈希碰撞;且只维护一个数据 */
    String now = DateUtil.toString(new Date(), DateUtil.DATE_FORMAT);
    Map<String, List<LogisticsAtomic>> oneDayData = WorkOrderCst.ONEDAYDATA;if (oneDayData.keySet().contains(now)) {
        list = oneDayData.get(now);
    } else {
        list = logisticsWorkOrderBo.getLogisticsList90DaysBefore(startTm, endTm);
        oneDayData.clear();
        oneDayData.put(now, list);
    }
    Map<String, String> map = new HashMap<String, String>();
    for (LogisticsAtomic bean : list) {
        if (null != bean.getSpId()) {
            map.put(bean.getSpId().toString(), bean.getAssetCounts().toString());
        }
    }
    return map;
}
//带null的数据:JSONUtils.toJSONString(map);
//不带null的数据:JSON.toJSONString(map);

注意:存放在JVM堆中的map要放在枚举变量中。放在方法中,每次new一个Map不正确;放在*BoImpl层中,由于*BoImpl并不是单例,而我们的项目又是部署在集群之上的,所以要把定义的变量值维护在枚举类当中。涉及到JVM内存布局知识。

public class WorkOrderCst {
    // 维护一天的数据
    public static Map<String, List<LogisticsAtomic>> ONEDAYDATA = new ConcurrentHashMap<String, List<LogisticsAtomic>>();
    // 拆单时机房分隔符
    public static final String SiteSplit = "#@#";
}

mapper层传入一个参数,筛选出最近三个月的数据:

SELECT
    COUNT(1)
FROM
    idc_work_order_main
WHERE
    gmt_create < CONCAT(‘2016-08-03‘,‘23:59:59‘)
AND gmt_create > date_sub(‘2016-08-03 00:00:00‘, INTERVAL 3 MONTH)

完结。

时间: 2024-09-29 17:24:30

记录一次bug解决过程:可维护性和性能优化的相关文章

记录一次bug解决过程:规范变量名称和mybatis的使用以及代码优化

一.总结 Mybatis中当parameterType为基本数据类型的时候,统一采用_parameter来代替基本数据类型变量. Mybatis中resultMap返回一个对象,resultType返回一个Map简单数据类型(由于需要缓存到JVM中)的映射关系. String类型转Integer类型:String类型转int类型用到的方法是不一样的. 方法入口处第一行写new Date(),防止时间在23:59:59跨界对逻辑带来影响. 考虑到上线app_resource表忘记配置供应商比例,在

记录一次bug解决过程:eclipse Installed JREs 配置引出的问题

一 总结 eclipse Installed JREs 配置引出的问题:编译以来JDK,不是JRE spring boot内嵌tomcat运行程序,tomcat:run 二 Bug描述:eclipse Installed JREs 配置引出的问题 刚新鲜检索出的代码,同学们编译都ok的,自己编译总是出错.原因在于eclipse Installed JREs 配置出错引出的问题.路径:windows->preferences->输入jre->Installed JRES->要依赖JD

记录一次bug解决过程:velocity中获取url中的参数

一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-site request forgery,跨站请求伪造),在form表单提交中要加入$!csrfToken.ajaxUniqueToken 二.Bug描述:Velocity从URL中获取parameter参数 在项目IDCM中,使用webx容器进行项目的开发.前端的模板引擎采用了velocity,在项目

记录一次bug解决过程:else未补全导致数据泄露

一.总结 快捷键ctrl + alt + 四个方向键 --> 倒置屏幕 未补全else逻辑,倒置查询数据泄露 二.BUG描述:else逻辑未补全,倒置查询数据泄露 在查询筛选参数的时候,有如下逻辑: if (StringUtils.isNotBlank(logisticsOrder.getParentIds())) { // 所属复合单 String[] ids = SqlStringUtil.sliptQueryStr(logisticsOrder.getParentIds()); for (

记录一次bug解决过程:resultType和手动开启事务

一.总结 二.BUG描述:MyBatis中resultType使用 MyBatis中的resultType类似于入参:parameterType.先看IDCM项目中的实际使用案例代码,如下: // List<Integer> orderIds = assetBeanMapperExt.getOrderIdsByParentIds(SqlStringUtil.formatInStr(logisticsOrder.getParentIds())); 我们的目的是通过*Ext层直接返回一个list,

记录一次bug解决过程:eclipse集成lombok插件

一 总结 eclipse集成插件lombok: 启动Spring Boot项目: sublime全局搜索关键字:ctrl + shift + F JDK8中的lambda表达式使用 二 BUG描述:集成eclipse插件lombok lombok插件,使用注解@Data的方式,从而省略了代码中频繁的getter和setter方法.安装插件:通过下载jar包安装,并且制定到你的eclipse.exe路径.官方下载地址:http://projectlombok.org/download.html.

记录一则ORA-00054,ORA-00031解决过程

生产环境:AIX 5.3 + Oracle 10.2.0.5 任务要求:普通表改造分区表,历史数据不要 这个需求很简单: pl/sql导出建表语句,依次修改成分区的建表语句,注意将索引修改成本地索引; drop 原表; create 新分区表. 1.重建过程中遇到问题:删除某表时报错ORA-00054,导致无法删除重建此表. SQL> drop table MOD_RESALT_PERF_CARR_1X_ZTE; create table MOD_RESALT_PERF_CARR_1X_ZTE(

STM32 .ld链接文件分析及一次bug解决过程

目录 STM32 .ld链接文件分析及一次bug解决过程 问题描述 解决办法 ld文件解析 后续 STM32 .ld链接文件分析及一次bug解决过程 问题描述 原子板的代码中含有一个关于使用外部SRAM的功能,由于本人的开发板的SRAM只有512K,因此稍微修改了一下代码,同时使用GCC进行编译,但是这里却报错了,源码如下: //内存池(4字节对齐) __align(4) u8 mem1base[MEM1_MAX_SIZE]; __align(4) u8 mem2base[MEM2_MAX_SI

记录 Ext 日历月份选择控件bug解决过程结果

目录 背景 代码 背景 项目使用 Ext.NET 2.2.0.40838 , 对应 Ext JS4.2 版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3月份,9月份之类. 就是无法选择, 选择谷歌以后发现有同样的问题, 然后各种尝试, 重写了默认属性,如下代码后解决. 收获就是调用平台有时候要知道原因才能找到未知原因并修复. 宝贵的额是Ext框架问题解决思路吧. 现记录. 改动的部分就是 dt.setDate(1); 这一句, 设置为当前月份第一天