濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > JSP  中使用cache取值出錯(cuò)解決辦法

JSP  中使用cache取值出錯(cuò)解決辦法

熱門標(biāo)簽:地圖標(biāo)注市場(chǎng)怎么樣 如何用中國(guó)地圖標(biāo)注數(shù)字點(diǎn) 百度地圖添加標(biāo)注圖標(biāo)樣式 聊城智能電銷機(jī)器人外呼 企業(yè)怎么在聯(lián)通申請(qǐng)400電話 泰州泰興400電話 怎么申請(qǐng) 南京新思維電話機(jī)器人 南昌市地圖標(biāo)注app 好操作的電話機(jī)器人廠家

 JSP  中使用cache取值出錯(cuò)解決辦法

 這段時(shí)間發(fā)現(xiàn)系統(tǒng)取數(shù)據(jù)過程中,偶爾出現(xiàn)取數(shù)據(jù)錯(cuò)亂的問題,按邏輯應(yīng)該取出A數(shù)據(jù),結(jié)果取出了B數(shù)據(jù)。仔細(xì)檢查了代碼,
發(fā)現(xiàn)代碼邏輯沒有問題,瞬間就蒙了,是哪里出現(xiàn)問題了呢。仔細(xì)想了一下,以前都沒出現(xiàn)問題,自從加了緩存之后就偶爾出現(xiàn)了問題,那肯定問題是緩存有問題。

仔細(xì)研究了緩存的源碼,原來問題出現(xiàn)在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); 
  } 
 
} 

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

比如下面代碼,雖然參數(shù)值不一樣但是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)); 
  } 

運(yùn)行結(jié)果如下:

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

您可能感興趣的文章:
  • window.top[_CACHE]實(shí)現(xiàn)多個(gè)jsp頁面共享一個(gè)js對(duì)象
  • JSP頁面緩存cache技術(shù)--瀏覽器緩存介紹及實(shí)現(xiàn)方法

標(biāo)簽:烏蘭察布 白銀 開封 銅川 自貢 吉林 山南 臨汾

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP  中使用cache取值出錯(cuò)解決辦法》,本文關(guān)鍵詞  JSP,amp,nbsp,中,使用,cache,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《JSP  中使用cache取值出錯(cuò)解決辦法》相關(guān)的同類信息!
  • 本頁收集關(guān)于JSP  中使用cache取值出錯(cuò)解決辦法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    静海县| 平乡县| 进贤县| 科技| 聊城市| 利辛县| 白山市| 车致| 南阳市| 铁岭县| 卓尼县| 贡嘎县| 方山县| 东兰县| 永昌县| 大埔县| 广灵县| 衡阳县| 楚雄市| 辽阳市| 集安市| 东乡县| 绥棱县| 武汉市| 苏州市| 凌源市| 泰安市| 福州市| 枣强县| 青浦区| 丹凤县| 兖州市| 兰溪市| 吴堡县| 滨海县| 乌什县| 通渭县| 尉氏县| 水城县| 抚顺市| 故城县|