我一发消息给技术大佬,技术大佬便发个嘲笑的表情包,接着回道,“渣渣,你又挖坑了!”我不回答,把截图发过去说,“这个数据不对,权限设置有问题。”便列出问题详情。大佬又生气的回道,“你一定又在挖坑了!”我睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我刚刚亲眼见你截图里的报错,是个大坑。”我便涨红了脸,额上的青筋条条绽出,争辩道,“报错不能算挖坑……debug!……码畜的事,能算坑么?”接连便是难懂的话,什么“粘贴复制”,什么“办”之类,引得大佬哄笑起来:聊天界面上充满了快活的空气。
——序
最近写了个普通查询的功能,加个判断逻辑,修改查询条件的值,为了自己写代码方便,直接把方法里的参数修改了。如下图:直接改了userInfo的user_id的属性。
然后我跑项目的时候,发现一个问题,项目其它模块功能受到了影响。比如下图同一个页面对于数据的查询,就会变成突然有时候查出来正确的数据,有时候查出来是错误的数据。
错误情况下:
正确情况下:
这个时候就要查问题了,查问题的时候,去查了浏览器的缓存,清了开发工具的缓存、清了redis的缓存(项目甚至没有用到redis),总之就是没有考虑自己写的代码有问题。内心OS:不可能是我代码有问题了,我写的代码怎么可能有错?(大误!)
后来就去跑被影响的功能,debug一下,发现下图中getUserInfo.getUser_id()的值在对应人员编码和""之间来回横跳。
机智如我立马判断出来这个getUserInfo()方法肯定是有问题的!(大误2!)
然后去debug跟着走完方法全程,没有发现任何问题。
这个时候,就只有找大佬来看了。这个坑只有大佬来填了。
然后大佬在UserInfo的getUser_id()处打了断点,跑了一下,发现在开头处我写的判断语句给userInfo设置为""的时候,等于是改变了UserInfo里的userID属性了。
然后大佬开始说些我听不懂的话了,什么ehcahe二级缓存,什么深复制浅复制,巴拉巴拉巴拉拉之类的。
重点是,系统中,UserInfo默认是存在ehcahe二级缓存的。我在上图代码传过来的UserInfo 实际上是被存入缓存中的UserInfo,所以在我实际上是修改了缓存中的UserInfo。
为什么我这里传进来的UserInfo和缓存中的UserInfo是一个UserInfo呢?
因为在JAVA程序中没有显示定义复制构造函数,在进行对象的复制时,将调用系统默认的复制构造函数,这就使得两个对象指向了同一资源。
本文讲述了作者在开发中因修改对象属性导致的程序错误,影响了系统其他模块。问题源于未深拷贝对象,从而无意中修改了缓存中的数据。在排查过程中,技术大佬指出了Java中的缓存机制、对象复制以及Ehcache二级缓存的问题。最终,通过深入理解对象引用和缓存原理解决了问题。
1819

被折叠的 条评论
为什么被折叠?



