当前位置: 移动技术网 > IT编程>开发语言>Java > JSP 中使用cache取值出错解决办法

JSP 中使用cache取值出错解决办法

2017年12月08日  | 移动技术网IT编程  | 我要评论

果蔬净化机,北京丰台区邮编,魔术教学视频

 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)); 
  } 

运行结果如下:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网