28个案例问题分析---012---在线人员逻辑反例--ThreadLocal、继承、索引失效、
创始人
2024-06-03 12:40:23
0

一:背景介绍

本文是对项目实战中出现的6个问题进行的总结,希望通过总结的方式,提升自己的技术水平,避免类似的错误。

具体问题

  1. 类中写了公共变量最后导致数据混乱现象
  2. 保存数据没有考虑业务的隔夜覆盖导致的逻辑漏洞
  3. 涉及到继承,对于this,如果父类有同样的成员最终使用哪一个?
  4. 参数不一致导致后续维护混乱
  5. mysql由于关联字段类型不一致导致产生索引失效问题,进而产生慢sql
  6. sql不考虑业务导致有明显的逻辑漏洞

上文涉及到的知识点主要有

  • 公共变量(1)、
  • 业务逻辑(2,4,6)、
  • 继承中的this(3)、
  • mysql索引失效(5)。

二:解决方案

一:类中公共变量由于线程共享,导致的数据混乱(公共变量)

在这里插入图片描述
线程是共享全局变量的,如果在业务过程中,对全局变量进行修改操作。在多线程的情况下,会产生全局变量数据混乱问题。

使用ThreadLocal变量

直接上代码

package org.example;public class Main {static ThreadLocal localVar = ThreadLocal.withInitial(() -> "默认localVar");static void  print(String str){//打印当前线程内存储的本地变量的值System.out.println( str +"   de~~~   " + localVar.get());}public static void main(String[] args) {//创建线程一Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {//打印一下localvar的值System.out.println("thread1线程" + localVar.get());//修改一下localvar的值localVar.set("thread1的local");//打印print("thread1");}});thread1.start();//创建线程二Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("线程二不共享localVar变量,值为默认值" + localVar.get());}});thread2.start();}
}

上述代码

  • 创建了一个 ThreadLocal类型名为localVar的变量,并且赋初值为 默认localVar
  • 一个打印 localVar值的print()方法
  • main方法 创建了两个线程,第一个线程操作修改了localVar的值,第二个线程直接打印了localVar的值

执行结果
在这里插入图片描述
从结果上我们可以看出 第一个线程修改了我们定义的localVar的值之后,第二个线程打印的仍是我们一开始初始化设置的默认值
结论:ThreadLocal 定义的变量是线程安全的

二:在线人员逻辑(逻辑漏洞)

问题二:保存数据没有考虑业务隔夜

在这里插入图片描述
在查询的逻辑里添加了 createDate的字段,这里的createDate是按照天取得年月日。如果跨天就会出现问题。

问题四:参数不一致,导致维护混乱

在这里插入图片描述
登录状态问题,这里的状态在之前的业务里,已经传入了,但是后续却用了一个魔法值表示,虽然功能上没有出现问题,但是却多了一个写死的值,不利与复用。

问题六:sql不考虑业务,出现明显逻辑漏洞

在这里插入图片描述
此sql对应的是教师进行结课之后,将学生的最近登录时间修改。这里存在两个问题。

  1. update_time字段的使用,这个是我们数据库建表规范必备三字段(id,create_time,update_time)之一,业务需要应该新建字段,而不是使用update_time字段
  2. 额外添加了createDate字段,用当天时间做为where条件,如果跨天的话,就会出现下线状态无法更新问题。

三:继承(this)

在这里插入图片描述
ava中继承关系的父子类,相同的方法会被重写
当子类父类中的成员没有重名时,子类都可以通过this去调用。
当成员方法 重名,子类就会将父类中的方法进行重写。如果还想调用父类中的方法只能通过 super去进行调用。
当时成员变量不存在覆盖重写:在子类中只能通过super调用父类的

四:慢sql问题(索引失效)

在这里插入图片描述
索引会因为 隐示数据转换造成 索引失效的问题。在设置外键的时候,一定要保持与相对应的主键的数据类型一致,否则查询的时候,就会出现不走索引的慢sql。
具体原因可以参考:mysql索引博客

三:总结升华

使用技术的时候,一定要清楚使用边界。出现问题要及时总结,保证不出同样的问题。

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...