緩存優化實驗報告

銷售助手-緩存優化實驗報告
2015.4.7 by ouyida3java

問題背景

移動APP-銷售助手(又名外勤通),個別頁面訪問很是慢,急需優化。ios

實驗環境

  • Oracle數據庫:測試環境32.121.2.132(性能還行,但發現偶爾會有問題)
  • 後臺WEB應用:本機環境MyEclipse+Weblogic(本機暫時發現很好,徹底沒有性能瓶頸)
  • 前臺MAPP應用:測試環境30.51.23.250(該機器是svn服務器,性能不怎麼樣)
  • 手機APP應用:iphone5,ios8.2安裝(沒有性能瓶頸)

優化手段

某些表使用Ehcache把數據經過Key-Value緩存,不用每次均從數據庫取數。web

優化代碼:
詳見:/mapp/src/com/age/mapp/bean/MappTaskBean.javasql

修改前,每次均讀取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));

爲了測試使用時間,在先後均加上時間的打印代碼:segmentfault

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 539oracle

DEBUG(MappTaskBean) 請求和返回時間分別是:2015-04-07 14:46:59 149 , 2015-04-07 14:46:59 133app

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

相關文章
相關標籤/搜索