JSP中缓存值使用错误的解决方案
在这段时间里,发现系统偶尔会出现取数据混乱的问题,数据A应该是逻辑取的,结果却取了数据B。仔细查看代码后,发现代码逻辑没有问题,瞬间就丢失了。发生了什么事?仔细一想,之前没有问题,偶尔加了缓存之后也有问题,所以问题肯定是缓存。
仔细研究缓存的源代码后,原来的问题出现在DefaultKeyGenerator生成的密钥上。代码如下:
公共类DefaultKeyGenerator实现了KeyGenerator { public static final int NO _ PARAM _ KEY=0;公共静态最终int NULL _ PARAM _ KEY=53公共对象生成(对象目标、方法方法、对象.params){ if(params . length==1){ return(params[0]==null?NULL _ PARAM _ KEY : params[0]);} if (params.length==0) {返回NO _ PARAM _ KEY} int hashCode=17for(Object Object : params){ hashCode=31 * hashCode(Object==null?NULL _ PARAM _ KEY : object . hashcode());}返回integer . value of(hashCode);}}从源代码中我们发现,当参数params有1或0时,直接返回NULL_PARAM_KEY或params[0],如果params参数大于1,则返回每个参数的哈希值为31*17。这样,就有问题了。虽然数据A的每个参数的值与数据B的不同,但是它们的参数的hashcode值可能是相同的,所以数据B有可能被数据A取出.(就像map一样,缓存中有key和值,值是根据key取的。).
例如,在下面的代码中,虽然参数值不同,但键是相同的。
public static void main(String argv[]){ DefaultKeyGenerator g=new DefaultKeyGenerator();整数param0=1000000759字符串param1=' 11system . out . println(' param0=' param 0 ',param 1=' param 1 ' generate key : ' g . generate(null,null,param 0,param 1));整数param01=1000000757字符串param11=' 31system . out . println(' param01=' param 01 ',param 11=' param 11 ' generate key : ' g . generate(null,null,param 01,param 11));}运行结果如下:
感谢您的阅读,希望对大家有所帮助,感谢您对本网站的支持!