使用memcached作爲orm緩存實現已經有一段時間了,
今天寫了一段測試代碼,想看看緩存對系統性能到底有多大提升,結果出乎意料。
測試方法 getById(String id),根據記錄id從數據庫中查出對象。
1. jdbc版本實現:直接用jdbc執行select方法,代碼大致如下
Java代碼
PreparedStatement pst = null;
ResultSet set = null;
sql = "select " + TABLECOLUMN + " from " + TABLENAME + " where "
+ IDCOLUMN + " = '"+id+"'";
pst = con.prepareStatement(sql);
set = pst.executeQuery();
BizObject b = helpSetValue(set); //從set到orm業務對象數據拷貝
return b;
PreparedStatement pst = null;
ResultSet set = null;
sql = "select " + TABLECOLUMN + " from " + TABLENAME + " where "
+ IDCOLUMN + " = '"+id+"'";
pst = con.prepareStatement(sql);
set = pst.executeQuery();
BizObject b = helpSetValue(set); //從set到orm業務對象數據拷貝
return b;
2.memcached實現,使用whalin客戶端實現
Java代碼
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
BizObject o = (BizObject)mcc.get(mccid);
if (o==null){
o = loadObject(id); //調用jdbc查詢,並set到memcached server
}
return o;
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
BizObject o = (BizObject)mcc.get(mccid);
if (o==null){
o = loadObject(id); //調用jdbc查詢,並set到memcached server
}
return o;
具體測試就是循環調用 getById方法 取出指定id,測試結果如下:
執行10次:
jdbc耗時:haoshi 31毫秒
memcached耗時:haoshi 109毫秒
執行100次:
jdbc耗時:haoshi 188毫秒
memcached耗時:haoshi 406毫秒
執行1000次:
jdbc耗時:haoshi 1579毫秒
memcached耗時:haoshi 2435毫秒,
memcache和oracle11g都安裝在同一IBMx3650服務器上,
測試結果是在另外一臺客戶機上運行得到的。
改用jcs本地緩存後,測試1000次循環只需要94毫秒。
oracle和memcached在同一臺服務器上(生產機),網絡狀況應該都一樣,排除這個差別,
memcached性能表現竟然比直接jdbc訪問要差,
由此可見,由於memcached的網絡訪問方式所限,無法達到很高的響應速度,
使用memcached只能分擔數據庫壓力,對系統性能的改善主要體現在提高系統可伸縮性,而不是提高絕對速度。
而是用本地jvm緩存能極大提高響應速度,但是由於集羣支持問題,擴展性有限。
綜述,在系統規模不是很大,沒有用到集羣,memcached佔用內存幾十兆的情況下,也就是普通的企業應用環境,
memcached並不能很好的發揮其優勢,可以考慮用普通的jvm緩存,如jcs等,在系統性能,部署複雜性等方面都較理想。