码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-03 20:27:23      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

一、总结

  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)

完结。

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

标签:

原文地址:http://www.cnblogs.com/RunForLove/p/5734114.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!