JSP 中使用cache取值出错解决办法
发布时间 - 2026-01-11 01:11:18 点击率:次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));
}
运行结果如下:
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# JSP
# cache取值出错
# cache
# 正确使用方法
# window.top[_CACHE]实现多个jsp页面共享一个js对象
# JSP页面缓存cache技术--浏览器缓存介绍及实现方法
# 的是
# 来了
# 就像
# 出了
# 有可能
# 都没
# 出现在
# 这段
# 希望能
# 想了
# 问题是
# 谢谢大家
# 解决办法
# 可能出现
# 过程中
# 有一个
# 出现了
# 蒙了
# 瞬间
# 是一样的
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用搬瓦工VPS快速搭建个人网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
怎么用AI帮你为初创公司进行市场定位分析?
,怎么在广州志愿者网站注册?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Android滚轮选择时间控件使用详解
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
手机软键盘弹出时影响布局的解决方法
韩国服务器如何优化跨境访问实现高效连接?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Android仿QQ列表左滑删除操作
如何用PHP快速搭建高效网站?分步指南
Laravel PHP版本要求一览_Laravel各版本环境要求对照
三星、SK海力士获美批准:可向中国出口芯片制造设备
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
清除minerd进程的简单方法
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
黑客如何利用漏洞与弱口令入侵网站服务器?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
高防服务器租用如何选择配置与防御等级?
如何快速生成凡客建站的专业级图册?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
北京企业网站设计制作公司,北京铁路集团官方网站?
大连网站制作公司哪家好一点,大连买房网站哪个好?
原生JS获取元素集合的子元素宽度实例
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
实例解析angularjs的filter过滤器
如何快速搭建高效香港服务器网站?
JavaScript常见的五种数组去重的方式
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Android GridView 滑动条设置一直显示状态(推荐)
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
香港服务器租用费用高吗?如何避免常见误区?
js实现获取鼠标当前的位置
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
如何挑选高效建站主机与优质域名?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
如何用狗爹虚拟主机快速搭建网站?
Laravel storage目录权限问题_Laravel文件写入权限设置
香港网站服务器数量如何影响SEO优化效果?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
如何在IIS管理器中快速创建并配置网站?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案

