记录一次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语句进行预编 ...
随机推荐
- css知多少之绝对定位小记
一.position定位常见属性 对于属性position来说,属性值有static/relative/absolute/fixed/inherit以下只对绝对定位position:absolute详 ...
- Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决
前提: 1.安装Android Studio(过程略) 2.官网下载OpenCV for Android 网址:http:opencv.org/downloads.html 我下载的是下图的版本 3. ...
- TFS 2015 敏捷开发实践 – 看板的使用
看板在现代应用开发过程中使用非常广泛,不管是使用传统的瀑布式开发还是敏捷开发,都可以使用看板管理.因为看板拥有简单的管理方法,直观的显示方式,所以很多软件开发团队选择使用看板进行软件开发管理.本文不在 ...
- [Hadoop in Action] 第5章 高阶MapReduce
链接多个MapReduce作业 执行多个数据集的联结 生成Bloom filter 1.链接MapReduce作业 [顺序链接MapReduce作业] mapreduce-1 | mapr ...
- Linux课堂笔记(一)
一.Linux应用领域及版本介绍. 1.服务器.嵌入式.桌面应用等. (1)在服务器领域中,需要安全和稳定,特别是越老的内核版本越安全.越稳定. (2)Linux主要分内核版和发行版. 内核版本2.6 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- BZOJ 2119: 股市的预测 [后缀数组 ST表]
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 331 Solved: 153[Submit][Status][Discuss ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- Linux下UPnP sample分析
一.UPnP简介 UPnP(Universal Plug and Play)技术是一种屏蔽各种数字设备的硬件和操作系统的通信协议.它是一种数字网络中间件技术,建立在TCP/IP.HTTP协 ...
- 对jquery操作复选框
摘要:jquery操作复选框.使用更简洁易懂,思路清晰,逻辑更明了,很实用 <!DOCTYPE html> <html> <head> <meta chars ...