Shun 发表于 2021-10-20 17:42:30

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

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 == null ? NULL_PARAM_KEY : params);
    }
    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,假如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));
}
运行结果如下:

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

https://www.uoften.com/program/jsp/20180413/48149.html
页: [1]
查看完整版本: JSP 中使用cache取值出错解决办法