时间:2021-05-26
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)); }运行结果如下:
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解JSP中使用过滤器进行内容编码的解决办法问题当通过JSP页面,向数据库中插入记录的时候,可能因为JSP页面编码原因,导致插入到数据库中的新纪录出现乱码。因此
在ADO中,我们需要在SQL语句中使用乘法运算,可是添加'*'以后执行程序总是会出错,这是因为‘*'与sql中的‘*'关键字重合了,所以编译会出错。解决办法:将
刚装的可以开发jsp的eclipse,结果写jsp的时候没有代码提示,在网上找了半天,各种解决办法都不行,后来在stackoverflow上看到一个解决办法解决
load方法没有设置cache参数默认true,特别在IE浏览器下,一般的ajax的方法都是cache等于true的。 解决办法几个: 1.使用.aja
1.Cannotwritetocachefiles,pleasecheckdirectory./data/and./data/cache/.无法写入缓存解决办法