国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

JSP  中使用cache取值出錯解決辦法

2020-07-27 21:22:58
字體:
來源:轉載
供稿:網友

 JSP  中使用cache取值出錯解決辦法

 這段時間發現系統取數據過程中,偶爾出現取數據錯亂的問題,按邏輯應該取出A數據,結果取出了B數據。仔細檢查了代碼,
發現代碼邏輯沒有問題,瞬間就蒙了,是哪里出現問題了呢。仔細想了一下,以前都沒出現問題,自從加了緩存之后就偶爾出現了問題,那肯定問題是緩存有問題。

仔細研究了緩存的源碼,原來問題出現在DefaultKeyGenerator生成key上面。代碼如下:

public class DefaultKeyGenerator implements KeyGenerator {    public static final int NO_PARAM_KEY = 0;   public static final int NULL_PARAM_KEY = 53;    public Object generate(Object target, Method method, Object... params) {     if (params.length == 1) {       return (params[0] == null ? NULL_PARAM_KEY : params[0]);     }     if (params.length == 0) {       return NO_PARAM_KEY;     }     int hashCode = 17;     for (Object object : params) {       hashCode = 31 * hashCode + (object == null ? NULL_PARAM_KEY : object.hashCode());     }     return Integer.valueOf(hashCode);   }  } 

從源碼中我們發現,當參數:params有一個或0的時候,直接返回NULL_PARAM_KEY或者參數params[0],假如params參數大于1的時候返回的是各個參數的hash值相加的值+31*17。這樣就出現問題了,雖然取A數據與取B數據的各個參數的值不一樣,但是有可能它們參數的hashcode值是一樣的,那么就可能出現取A數據把B數據取出來了。(cache中就像map一樣,有key和value,根據key來取value值)。

比如下面代碼,雖然參數值不一樣但是key是相同的。

public static void main(String argv[])   {     DefaultKeyGenerator g = new DefaultKeyGenerator();     Integer param0 = 1000000759;     String param1 = "11";     System.out.println(" param0="+param0+", param1="+param1+" generate key: "+g.generate(null,null,param0,param1));     Integer param01 = 1000000757;     String param11 = "31";     System.out.println("param01="+param01+",param11="+param11+" generate key: "+g.generate(null,null,param01,param11));   } 

運行結果如下:

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持! 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东宁县| 舟山市| 水富县| 东乡县| 奉新县| 苍南县| 巨鹿县| 新丰县| 尚志市| 来宾市| 从江县| 福鼎市| 图木舒克市| 沙湾县| 敦化市| 钦州市| 达孜县| 噶尔县| 乾安县| 清徐县| 上虞市| 阜平县| 富平县| 六枝特区| 龙川县| 石阡县| 资溪县| 乐安县| 那坡县| 无为县| 奉贤区| 莱西市| 双牌县| 河源市| 高雄县| 平湖市| 德化县| 中超| 青州市| 潞西市| 大连市|