记录一次bug解决过程:可维护性和性能优化
一、总结
- 使用某些变量的地方在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不正确。此外,JVM的单例必须限定在一个JVM中,就像是JVM只会存在一个实例,这句话也是限定在一个 JVM 中的,如果是多个 JVM 就会每个 JVM 存在一个实例。java语言层面的单例说的是同一个jvm里面,集群没办法搞。如果你想设置的单例目的是为了数据共享,那数据存数据库或是redis之类的地方。故放在*BoImpl层中,或维护在枚举值变量中,而我们的项目又是部署在集群之上的,故无法保证集群上共享的是同一个Map。
public class WorkOrderCst {
// 维护一天的数据
public static Map<String, List<LogisticsAtomic>> ONEDAYDATA = new ConcurrentHashMap<String, List<LogisticsAtomic>>();
// 拆单时机房分隔符
public static final String SiteSplit = "#@#";
}
那么可以做到保证在一个集群机器上,只保存一个静态变量ONEDAYDATA。因为类的静态变量是此类的所有实例化对象全局共享的。即指向同一块内存,只要一个对象更改了静态变量,其他对象读到的都是更改后的静态变量。因此从设计上而言,也很容易理解,静态变量也称之为类变量,可以直接使用类名访问而不需要通过类对象访问。这要看你的业务需求,原则上是尽量减少不必要的静态变量。故此处设置为静态变量,可以保证集群的一台机器上,只维护一个静态变量。
//#JVM内存总体四部分:(stack segment、heap segment、code segment、data segment) //当我们在程序中,申明一个局部变量的时候,此变量就存放在了 stack segment(栈)当中;
//当new 一个对象的时候,此对象放在了heap segment(堆)当中;
//而static的变量或者字符串常量 则存在在 data segment(数据区)中;
//那么类中方法的话,是存在在 code segment(代码区)中了。
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)
一行代码初始化ArrayList:
//ArrayList<String> list_01 = new ArrayList<String>(){{add("1");add("2");add("3");}};
//ArrayList<String> list_02 = new ArrayList<String>(Arrays.asList("1","2","3"));
如何在Navicat中查看一条SQL语句的执行时间:

关于走索引的主键id和不走索引的in查询速度哪个快的情况,结果in比主键索引快,讨论如下:
完结。
记录一次bug解决过程:可维护性和性能优化的更多相关文章
- 记录一次bug解决过程:velocity中获取url中的参数
一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...
- 记录一次bug解决过程:else未补全导致数据泄露和代码优化
一.总结 快捷键ctrl + alt + 四个方向键 --> 倒置屏幕 未补全else逻辑,倒置查询数据泄露 空指针是最容易犯的错误,数据的空指针,可以普遍采用三目运算符来解决 SVN冲突解决关 ...
- 记录一次bug解决过程:数据迁移
一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...
- 记录一次bug解决过程:git深入学习和JDK8新特性
一 总结 熟悉廖雪峰git基础; 由于git跟踪的是修改,而不是版本号:因此对于修改撤销的操作,文件在eclipse中依旧有>修改标记,这点不同于svn. 二 BUG描述:熟悉Git基础 在Gi ...
- 记录一次bug解决过程:规范变量名称和mybatis的使用以及代码优化
一.总结 Mybatis中当parameterType为基本数据类型的时候,统一采用_parameter来代替基本数据类型变量. Mybatis中resultMap返回一个对象,resultType返 ...
- 记录一次bug解决过程:eclipse集成lombok插件
一 总结 eclipse集成插件lombok: 启动Spring Boot项目: sublime全局搜索关键字:ctrl + shift + F JDK8中的lambda表达式使用 二 BUG描述:集 ...
- 记录一次bug解决过程:eclipse Installed JREs 配置引出的问题
一 总结 eclipse Installed JREs 配置引出的问题:编译以来JDK,不是JRE spring boot内嵌tomcat运行程序,tomcat:run 二 Bug描述:eclipse ...
- 记录一次bug解决过程:resultType和手动开启事务
一.总结 二.BUG描述:MyBatis中resultType使用 MyBatis中的resultType类似于入参:parameterType.先看IDCM项目中的实际使用案例代码,如下: // L ...
- 记录一次bug解决过程:mybatis中$和#的使用
一.总结 mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数.动态SQL是mybatis的强大特性之一,也是它优于其他ORM框架的一个重要原因.mybatis在对sql语句进行预编 ...
随机推荐
- JAVA回调机制解析
一.回调机制概述 回调机制在JAVA代码中一直遇到,但之前不懂其原理,几乎都是绕着走.俗话说做不愿意做的事情叫做突破,故诞生了该文章,算是新年的新气象,新突破! 回调机制是什么?其实回 ...
- ubuntu15.04 nginx1.6.5 配置虚拟主机
1 在/etc/hosts 添加host 2 在/etc/nginx/nginx.conf中查看http里的include ****** /*.conf的路径,在此路径下添加一个新的******. ...
- centos6.5 nginx-1.8.0和ftp搭建图片服务器
一.Nginx的安装步骤 1.Nginx安装环境: gcc: 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c+ ...
- D3.js学习(七)
上一节中我们学会了如何旋转x轴标签以及自定义标签内容,在这一节中,我们将接触动画(transition) 首先,我们要在页面上添加一个按钮,当我们点击这个按钮时,调用我们的动画.所以,我们还需要在原来 ...
- On cloud, be cloud native
本来不想起一个英文名,但是想来想去都没能想出一个简洁地表述该意思的中文释义,所以就用了一个英文名称,望见谅. Cloud Native是一个刚刚由VMware所提出一年左右的名词.其表示在设计并实现一 ...
- JavaScript单线程和浏览器事件循环简述
JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...
- 我叫Twenty,我是要成为博客王的博客框架
标题套用了路飞的格式,其实我想说的是大多数都不相信你的梦想,直到你快走到了. 不废话了,介绍一下twenty: 这是基于CMS框架 zerojs打造一个博客.zerojs 的架构介绍在这里http:/ ...
- 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<8-14>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
- 关于ie6/7下的z-index
z-index这个属性其实在挺多地方都会用到,在百度上搜索也有大量关于z-index的篇幅去阐述这个属性,特别是在ie6下的z-index处理有更多的相关文章,本文就不再围绕z-index这一属性的基 ...