销售助手-缓存优化实验报告
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的方法:
java
comdao.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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。