28个案例问题分析---012---在线人员逻辑反例--ThreadLocal、继承、索引失效、
创始人
2024-06-03 11:55:28
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索引博客

三:总结升华

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...