销售助手-缓存优化实验报告
2015.4.7 by ouyida3

问题背景

移动APP-销售助手(又名外勤通),个别页面访问非常慢,急需优化。

实验环境

  • Oracle数据库:测试环境32.121.2.132(性能还行,但发现偶尔会有问题)
  • 后台WEB应用:本机环境MyEclipse+Weblogic(本机暂时发现很好,完全没有性能瓶颈)
  • 前台MAPP应用:测试环境30.51.23.250(该机器是svn服务器,性能不怎么样)
  • 手机APP应用:iphone5,ios8.2安装(没有性能瓶颈)

优化手段

某些表使用Ehcache把数据通过Key-Value缓存,不用每次均从数据库取数。

优化代码:
详见:/mapp/src/com/age/mapp/bean/MappTaskBean.java

修改前,每次均读取oracle的方法:

javacomdao.getStaticValue
修改后,只第一次从oracle读取,第二次以后从缓存读取:CacheUtils.getStaticValue
代码如下:
// 优化效率,改为读取缓存 author Ouyida3 2015.4.4
//taskmap.put("URGENT", comdao.getStaticValue(task.getString("URGENT"), "MAPP_EMERGENT_TYPE")); 
taskmap.put("URGENT", CacheUtils.getStaticValue(task.getString("URGENT"), "MAPP_EMERGENT_TYPE", pd));

为了测试使用时间,在前后均加上时间的打印代码:

java// 增加时间差显示,优化效率时使用 2015.4.4
Date beginDate = null;
if (log.isDebugEnabled()) {
    beginDate = new java.util.Date();
}

taskmap.put("URGENT", CacheUtils.getStaticValue(task.getString("URGENT"), "MAPP_EMERGENT_TYPE", pd));

// 增加时间差显示,优化效率时使用 author OuyangDa 2015.4.4
if (log.isDebugEnabled()) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
    Date endDate = new Date();
    String beginTime = sdf.format(beginDate);
    String endTime = sdf.format(endDate);

    log.debug("请求和返回时间分别是:" + endTime + " , " + beginTime);
}

修改前的时间占用
连续进行了5次测试。第一次和第三次分别占用了15和16毫秒,其余均占用0毫秒。证明即使连接oracle,也不是每次都占用毫秒级的时间,应该是oracle内部作了优化,把同样的sql放到缓存池了,提高了命中率。

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:46:12 039 , 2015-04-07 14:46:12 024

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:46:35 539 , 2015-04-07 14:46:35 539

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:46:59 149 , 2015-04-07 14:46:59 133

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:47:47 117 , 2015-04-07 14:47:47 117

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:48:11 117 , 2015-04-07 14:48:11 117

修改后的时间占用
第一次访问,使用时间均为16毫秒。重启了weblogic,再次试验,第一次访问还是为16毫秒。

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:34:45 961 , 2015-04-07 14:34:45 945

第二次以后的访问,使用时间均为0毫秒。说明此时的占用时间已经是微妙级以下。

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:28:36 524 , 2015-04-07 14:28:36 524

DEBUG(MappTaskBean) 请求和返回时间分别是:2015-04-07 14:36:26 695 , 2015-04-07 14:36:26 695

实验结论
结论一

  • 第一次连接Oracle数据库的时间:大约16毫秒
  • 一模一样的SQL,第二次以后连接Oracle数据库的时间:大多数为0毫秒,偶然会占用大约16毫秒
  • 从Ehcache取数时间:大约0毫秒
    也就是说从Oracle取数与从Ehcache缓存里取数,相差的时间大约为16毫秒。

结论二

  • 对于简单的SQL,无须从Oracle优化为缓存。
  • 因为简单的SQL,只要每次都能在Oracle里命中,从Oracle里取数也能达到0毫秒的性能。

ouyida3的segmentfault的blog
2015.4.7


ouyida3
117 声望3 粉丝

技术爱好者,敏捷粉丝,关注前端、java、数据库和云计算。