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配置与解决方案