程序员血泪史:上线出错后,我做了这三件事儿...

简介: 小米,29岁程序员,分享了系统上线遇到的两个问题及其解决方法:一是限售规则错误导致非配置地区也能购买,通过改进匹配逻辑和细化地区限制解决;二是商品详情页信息被误清空,采用深拷贝对象避免直接影响JPA缓存。总结了代码精确匹配、谨慎处理持久化对象及重视用户反馈的重要性。



哈喽大家好,我是小米,一个对技术充满热情的29岁程序员!最近我们系统上线遇到了一些问题,解决之后觉得特别有收获,今天就和大家分享两件事儿,希望对你们也有帮助。

第一件事:限售问题

背景回顾

上线后运营配置了北京、天津等20个省的限售规则,但后来发现,即便新疆没有在配置范围内,用户依然能进行购买!这不禁让我们挠头了,于是开始定位问题。

首先,我们检查了限售逻辑,发现代码大致如下:

在这个逻辑里,只要请求的地址以某个配置省的编号开头,就允许购买。但问题在于,数据库里天津的编号是2,而新疆是28,所以startsWith("2")直接把新疆也算进去了!

解决方案一:改用equals写法

我们的第一反应是将startsWith改为equals,代码如下:

测试的时候,我们发现仍然有问题!比如请求参数是"27|2386|2387|13185",按理应该取到27,但结果却一直是2。这时候我们翻看了split方法的源码,发现它支持正则表达式,而单个竖线|是正则里的“或”操作符,实际分割根本没有生效。

于是,我们改成了:

这个修改后,split能够正确分割出27了,经过测试没问题。

解决方案二:细化到区县级

然而,这样的修改仍然只能匹配到省级,假如北京市大兴区允许购买,而北京市海淀区不允许购买,还是无法满足需求。

最终,我们将限售地区存储的结构改为数组形式,将请求参数也转换为数组,然后对数组内容进行比对:

通过这样细化到区县级的匹配,彻底解决了限售问题。

第二件事:商品详情页信息清空

问题现象

上线后,用户发现多数商品的详情页信息变成了空数据。经过排查,我们发现,当用户点击某个商品时,详情页就被清空了!

最终定位到如下代码:

问题在于,goods对象被JPA缓存管理,当我们设置goodsDetail=null时,这一修改直接影响了缓存中的实体对象,导致数据库中的商品详情也被清空!

解决方案:深拷贝对象

为了避免直接修改JPA的实体对象,我们改成了深拷贝的方式:

这里的KsBeanUtil.convert是我们团队的一个工具方法,用于深拷贝对象。这样一改后,生产环境终于稳定了!

JPA缓存机制解析

JPA的EntityManager会自动管理实体对象的生命周期,默认情况下,查询到的对象会被缓存。如果直接修改查询到的实体对象属性,这种变化会被自动同步到数据库,导致意外的问题。所以,在需要修改返回值但不希望影响数据库时,深拷贝是一个安全的选择。

总结

以上就是这次上线遇到的两件事儿,虽然过程一波三折,但最终通过团队的协作和不断摸索,问题都顺利解决。总结几个教训:

  • 代码中多用精确匹配,减少模糊逻辑引发的问题。
  • 谨慎操作持久化对象,尤其在JPA中。
  • 上线后多关注用户反馈,快速响应问题,快速迭代。

END

每一次系统上线,问题的背后都是对代码和业务的深刻洞察。这次分享的两件事,包含了限售规则的优化和JPA缓存机制的深入理解,希望能给大家带来启发!如果你也遇到类似的问题,欢迎留言和我讨论哦~

小米会持续分享更多技术干货,咱们下次见!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关文章
|
7月前
|
设计模式 算法 程序员
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
作为开发者,我们在日常开发过程中,往往会遇到反复修改bug的情况,而且不能一次性把代码写的完美无瑕,其实开发项目是一项复杂而富有挑战性的任务,即使经验丰富的程序员也难以在一次性编写完美无瑕地完成代码,我个人觉得一次性写好代码是不可能完成的事情。虽然在设计之初已经尽力思考全面,并在实际操作中力求精确,但程序员仍然需要花费大量时间和精力来调试和修复Bug。那么本文就来分享程序员需要反复修改Bug的原因,以及在开发中所面临的复杂性与挑战。
186 1
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
|
6月前
|
程序员 C# C++
lpszBlogName C#开发多年中途被迫改行C++但工作中又经常偷偷使用C#的C++程序员
通过AUMID解析出packageFamily,再根据PackageManager解析出安装目录 PackageManager是WinRT的类型,如何在c++中使用WinRT,请参考C++/WinRT 以下代码需要管理员权限才能运行。
|
7月前
|
测试技术 程序员 项目管理
甲方怒喷半小时:一次项目上线失败的深刻教训
小米分享了一次项目上线失败的经历,起因是运营提出一个看似简单的白名单功能。问题包括:没有需求原型导致理解偏差,新成员对项目不熟悉,测试流程不全面,以及人员变动大。解决方案涉及需求确认会、原型图设计、交接制度、团队培训和全流程测试等。这次失败提供了关于需求分析、项目管理及团队协作的教训。
62 2
|
存储 缓存 搜索推荐
想要快速地拥有Sitecore DXP平台!这九个开发大坑一定要避开!
随着互联网技术的深入的发展,人们对于个性化的渴望已经达到了新的阈值,这也让以数字洞察力、个性化体验为名的Sitecore DXP平台成为了品牌们竞相追捧的新宠。而在这样的需要背景下,一众新手企业纷纷投身市场,想要分一杯羹。但是经验不足的新人入场,难免会带来不少麻烦,甚至引发了人们对于Sitecore性能的质疑。
|
人工智能 小程序
行动派:想到就做,无关乎与成功或失败,重在过程!
行动派:想到就做,无关乎与成功或失败,重在过程!
190 0
|
缓存 JavaScript 小程序
接手前同事代码,特别烂,各种BUG,看麻了。。。
接手前同事代码,特别烂,各种BUG,看麻了。。。
|
编译器 C++
还在因为写项目函数太多而烦恼?C++模板一文带你解决难题
还在因为写项目函数太多而烦恼?C++模板一文带你解决难题
|
开发框架 Java 测试技术
【测试基础】五、这样提bug单,开发小哥还会怼你么?
【测试基础】五、这样提bug单,开发小哥还会怼你么?
【测试基础】五、这样提bug单,开发小哥还会怼你么?
求职准备 | 没做好这三件事情,千万不要去面试
做业务管理者期间,面试了近百位候选人,从“管理者+职场内容博主”结合的视角,总结了求职准备期间最重要的三件事情。文章较长、干货较多,期待你耐心看完,让你的求职准备少走弯路。
2404 9
求职准备 | 没做好这三件事情,千万不要去面试
|
Java 程序员 开发工具
工作 3 年的同事不知道如何回滚代码,我真是醉了。。
工作 3 年的同事不知道如何回滚代码,我真是醉了。。
129 0
工作 3 年的同事不知道如何回滚代码,我真是醉了。。
下一篇
DataWorks