加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 教程 > 正文

JSP中使用cache取值出错如何解决

发布时间:2023-06-13 13:23:09 所属栏目:教程 来源:
导读: JSP中使用cache取值出错怎么办?我们在jsp中偶尔会发现取数据错乱的问题,那么这是怎么一回事呢?仔细想了一下,有可能是缓存出了问题,那么我们现在一起跟小编去看看具体内容吧。

JSP 中使用cache取值出错解决
 JSP中使用cache取值出错怎么办?我们在jsp中偶尔会发现取数据错乱的问题,那么这是怎么一回事呢?仔细想了一下,有可能是缓存出了问题,那么我们现在一起跟小编去看看具体内容吧。
 
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 DefaultKeyGenerato
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!