2024-04学习笔记

1.sql优化-子查询改为外连接

1.改之前

改之前是这样,那针对查出来的每一条数据,都要执行一次箭头所指的函数

执行的sql很慢

2.改之后

改之后是这样,整体做外连接,不用每一条都再执行一次查询

执行时间缩短了好几倍

 2.Mybatis中不要有太多空行

正常人的操作肯定是sql在工具里执行没问题了,再粘贴到Mybatis中

但是有个奇怪的现象,mybatis一执行就报错,就算我把控制台打印的sql沾到工具里边执行也没问题

 Caused by: java.util.concurrent.ExecutionException: net.sf.jsqlparser.parser.ParseException: 
Encountered unexpected token: "AND" "and"at line 8, column 1.Was expecting:<EOF>

 然后把Mybatis中的空行删除之后,就好了

正常情况下  <if>标签是会去掉第一个and

个人觉得是因为接下来的<if>因为前边有空行,没办法识别and是否需要去掉

3.FIND_IN_SET函数

FIND_IN_SET( #{item}, a.sourceDatabaseName) > 0

FIND_IN_SET('子串','母串'),母串是逗号分割的,如果>0,说明子串是逗号分割后其中的一个元素

比如

子串是母串其中一个元素时候才返回true  如果子串是1,母串是11,就返回false了 

 母串和子串相等时候也返回true

 4.GROUP_CONCAT(字段  SEPARATOR 分隔符 )函数

这个1中介绍过了,可以和group by一起用,也可以作为子查询时候使用

适用于把多个结果用符号分割拼一起

4.1子查询时候使用

select devInstance.inst_id as                        id,(SELECT GROUP_CONCAT(dbInput.source_database_name SEPARATOR ';') namefrom sys_data_develop_db_input dbInputwhere dbInput.task_id = devInstance.task_id) source
from sys_data_develop_instance devInstance

出来得结果就是

1  a;b;c

2  a;c;d

4.2.和group by一起使用

SELECT dbInput.task_id,GROUP_CONCAT(dbInput.source_database_name SEPARATOR ',') databaseName,GROUP_CONCAT(dbInput.source_table_name SEPARATOR ',')    tableName
from sys_data_develop_db_input dbInput
group by dbInput.task_id

5.pom.xml中得option

6. Mybatis传入了Map<Integer,List<String>>

    /*** key是类型,value是该类型对应的id,不同表中id类型不同所以统一用string接收* */Map<Integer,List<String>> taskIdMap;

mybatis,循环key时候用 OR 隔开

<if test="queryParams.taskIdMap != null and queryParams.taskIdMap.size()>0">and<foreach item="list" index="key" collection="queryParams.taskIdMap" open="(" separator=" OR " close=")">(a.taskType = #{key}and a.id in<foreach item="item" collection="list" open="(" separator="," close=")">#{item}</foreach>)</foreach></if>

执行时控制台打印

 AND ((a.taskType = ? AND a.taskId IN (?, ?)) OR(a.taskType = ? AND a.taskId IN (?)))

7.Mybatis缓存

7.1一级缓存

一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。

Mybatis默认开启一级缓存。 

 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

 7.2二级缓存

二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,

不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,

第一次执行完毕会将数据库中查询的数据写到缓存(内存),

第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。

Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。

二级缓存:根据命名namespace、查询语句方法名及查询参数等拼接的一个缓存key,value值是第一次从数据库查询出来的结果

但是避免使用二级缓存 

会有脏数据存在。因为同一个namespace下发生删改查才会清缓存,但是别人的namespace下对这个表有修改 是不会删缓存的  所以往下执行的之后还是旧数据 

 8.同步异步 阻塞非阻塞

阻塞 非阻塞 指的是线程的状态

9.同样的sql在不同环境下,执行时间差异很大

数据量的问题

dev比test多了190万数据,把没用的数据删除了就好了

10.垃圾回收与资源利用

 空间不够会GC,GC要stop the world,所以尽量减少GC

垃圾回收--堆
逃逸分析--栈
所以在栈中不断new 对象  可以避免垃圾回收

 

 

 池化:数据库连接池,线程池

11.MapStruct把两个实体映射到同一个实体上

后端来源的表不同,对应的实体也不同。但是返回给前端的时候是几个表一起返回

这时候就涉及到多个实体去映射到一个实体上

12.Springboot内置的tomcat

在start下有tomcat

13.集群和微服务

集群和分布式概念不同

集群,每个服务器做的事情相同

分布式,每个子节点做的事情不同

分布式和集群可以整合

比如现在每个微服务都是多实例,每个微服务在整体业务系统中只负责自己一块的业务,这些个集群整合在一起才是一个完整的业务系统

14.发令枪

await() 方法是用来阻塞线程的,等待倒计锁被减到0的时候,才会唤醒该方法继续执行。也可以设置等待超时时间

 15.Redis

1.IO多路复用

 2.备份

 

3.生活中使用的Redis

 1.redis计数

阅读量,访问量

 

2.购物车列表

那些图片可以写个接口异步加载,其他信息可以直接从redis取

 

 3.公众号,最新发布的消息放在最前边

用redis命令实现,类似栈,先进先出

4.朋友圈点赞

 

4.慢查询

 

5.主从

 

 

哨兵模式  先搭主从 再搭哨兵

 6.redis集群

 

扩容之后需要重新分配槽点,以及转移 数据

16.SSE

sse(​​Server Sent Event​​),直译为服务器发送事件,顾名思义,也就是客户端可以获取到服务器发送的事件

如果前端给后端发送一次消息后就不再发送消息,可以用SSE

比如我们项目的应用场景,前端把数据提交给后端之后,前端在页面上等待后端的返回信息

后端会持续不断的返回,每一种情况的校验结果

下面是我写的DEMO,分三种情况

全都测试过的,建议第二种第三种更好

@Api(tags = "sse测试")
@RestController
@RequestMapping("/api/v1/sse")
@RequiredArgsConstructor
@Slf4j
public class SSEController {private final SysDataCollectionOfflineTaskService service;/*** 测试通过的* @param response* @param collectionOfflineTaskForm*/@PostMapping(value = "/get")public void push(HttpServletResponse response, @RequestBody CollectionOfflineTaskForm collectionOfflineTaskForm) {//接收前端传来得参数String id = collectionOfflineTaskForm.getId();log.info(id);response.setContentType("text/event-stream");response.setCharacterEncoding("utf-8");PrintWriter pw = null;try {for (int i = 0; i < 3; i++) {Thread.sleep(1000);pw = response.getWriter();//todo 这里result是模拟业务逻辑处理得返回值Result<String> result = Result.success("测试");String json = JSONObject.toJSONString(result);//注意返回数据必须以data:开头,"\n\n"结尾//postman能看到返回的只有json数据 并没有前边得"data:"和后边的"\n\n"pw.write("data:" + json + "\n\n");pw.flush();//检测异常时断开连接if (pw.checkError()) {log.error("客户端断开连接");pw.close();return;}}} catch (Exception e) {//e.printStackTrace();log.error(e.getMessage());} finally {if (Objects.nonNull(pw)) {pw.close();}}}/*** 测试通过的* 返回类型必须SseEmitter* @param collectionOfflineTaskForm* @return*/@PostMapping("/events")public SseEmitter handleEvents(@RequestBody CollectionOfflineTaskForm collectionOfflineTaskForm) {//接收前端传来得参数String id = collectionOfflineTaskForm.getId();log.info(id);SseEmitter emitter = new SseEmitter();Result<String> result = Result.success("测试");//需要开启新线程 在一个新的线程中发送事件数据。这样可以确保主线程不会被阻塞,同时能够实现实时的事件流向客户端。new Thread(() -> {try {for (int i = 0; i < 3; i++) {emitter.send(SseEmitter.event().data(result));Thread.sleep(1000);}emitter.complete();} catch (IOException | InterruptedException e) {emitter.completeWithError(e);}}).start();return emitter;}/*** 测试通过* @Async异步* @param collectionOfflineTaskForm* @return*/@PostMapping("/test")public SseEmitter test(@RequestBody CollectionOfflineTaskForm collectionOfflineTaskForm) {//接收前端传来得参数String id = collectionOfflineTaskForm.getId();log.info(id);//需要开启新线程 在一个新的线程中发送事件数据。这样可以确保主线程不会被阻塞,同时能够实现实时的事件流向客户端。SseEmitter emitter = new SseEmitter();service.sseTest(emitter);return emitter;}
}
    @Override@Asyncpublic void sseTest(SseEmitter emitter) {Result<String> result = Result.success("测试");//需要开启新线程 在一个新的线程中发送事件数据。这样可以确保主线程不会被阻塞,同时能够实现实时的事件流向客户端。//new Thread(() -> {try {for (int i = 0; i < 3; i++) {emitter.send(SseEmitter.event().data(result));Thread.sleep(1000);}emitter.complete();} catch (IOException | InterruptedException e) {emitter.completeWithError(e);}//}).start();}

postman测试结果如图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/316463.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32HAL库-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

修改Ubuntu远程登录欢迎提示信息

无论何时登录公司的某些生产系统&#xff0c;你都会看到一些登录消息、警告或关于你已登录服务器的信息&#xff0c;如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中&#xff0c;地图功能是一个非常常见且实用的功能&#xff0c;可以帮助用户快速定位并浏览周边信息。而在uni-app开发中&#xff0c;使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项&#xff0c;帮助开发者顺利完成地图功能…

c#数据库: 5.删除指定年级的学生信息

将成绩为100分的学生信息从学生信息表中删除。删除前的学生信息表如图: using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks;namespace StudentDelete {internal class Progr…

探索设计模式的魅力:主从模式与AI大模型的结合-开启机器学习新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索主从模式与AI大模型之旅✨ &#x1f31f;Hey, tech enthusiasts! 你是否还在追…

列表页和表单页:移动UI设计的噩梦,该如何破?

hello&#xff0c;我是大千UI工场&#xff0c;列表页和表单页在网页UI中非常常见&#xff0c;极易处理&#xff0c;如果挪到了移动UI上&#xff0c;简直就是设计的噩梦&#xff0c;本文分析噩梦成因&#xff0c;给出破解之道和实际案例。 一、列表页——移动UI设计的噩梦 列表页…

Macs Fan Control Pro for mac激活版:macOS 平台的风扇控制软件

Macs Fan Control Pro是一款用于 macOS 平台的风扇控制软件&#xff0c;它允许用户监控和调整 Mac 电脑的风扇转速。以下是该软件的一些特点和功能&#xff1a; Macs Fan Control Pro for mac激活版下载 风扇监控&#xff1a;Macs Fan Control Pro 提供实时的风扇转速监控&…

2024.4.29

模板类实现顺序栈 #include <iostream>using namespace std; template <typename T> class Seqlite{T data[30];int len0; public:void head_inst(T date);void head_dele();void show(); }; template <typename T> //头插函数 void S…

Chrome 网络调试程序 谷歌网络调试 network

目录 1.网络面板总览2.概况了解3.Waterfall接口排队等待时间4.关注请求接口的Size,可能是占据内存溢出的接口5.过滤器一栏 fetch/xhr 什么意思6. Stalled 什么意思7.Queueing 什么意思8.Queueing和Stalled之间什么关系9.为什么会有阻塞状态10.Time列是pending 什么意思 1.网络面…

Sublime Vim模式配置:q关闭当前标签页

在Sublime安装目录下的->Packages文件夹下新建User文件夹创建文件Vintage.sublime-commands 路径为Sublime安装目录->Packages->User->Vintage.sublime-commands文件内容如下[{"caption": ":w - Save","command": "save"}…

面试ssss

深拷贝和浅拷贝 深拷贝和浅拷贝是关于对象&#xff08;包括数组&#xff09;复制的两个概念。 浅拷贝在复制对象属性的时候&#xff0c;复制的是指针&#xff08;引用&#xff09;&#xff0c;所以&#xff0c;修改目标对象的属性值会影响到原对象的对应属性值 obj。assign …

Hadoop之路---伪分布式环境搭建

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;创建完hado…

Ansible-Tower安装破解

主机IP地址版本Ansible192.168.169.2042.9.1Tower192.168.169.2043.6.2 基础环境 systemctl disable firewalld --now && setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config mv /etc/yum.repos.d/CentOS-* /tmp/ curl -o /etc/yum.repo…

JAVA实现easyExcel批量导入

注解类型描述ExcelProperty导入指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写&#xff0c;默认第一个字段就是index0&#xff0c;以此类推。千万注意&#xff0c;要么全部不写&#xff0c;要么全部用index&#xff0c;要么全部用名字去匹配。…

Unity 实现原神中的元素反应

一、元素反应 原神中共有七种元素&#xff0c;分别是水、火、冰、岩、风、雷、草。这七种元素能互相作用 Demo下载&#xff1a;Download 元素反应表格图示&#xff0c;可能不够精准 /火水雷冰草岩风绽放原激化火/蒸发超载融化燃烧结晶扩散烈绽放/水蒸发/感电冻结/碎冰绽放结晶…

mysql优化面试总结

mysql优化 和 mysql优化之索引 两篇文章有大量的实验性的内容&#xff0c;我暂时没时间理解&#xff0c;把八股部分总结到这篇文章中&#xff0c;方便记忆 我们为什么要对sql进行优化 我们开发项目上线初期&#xff0c;由于业务数据量相对较少&#xff0c;一些SQL的执行效率对…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营带来了极大便利&#xff0c;越来越多的企业依赖网络开展各项工作业务&#xff0c;网络也大大提升了企业的生产运营效率&#xff0c;但网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全…

泽攸科技无掩膜光刻机在MEMS压力传感器制造中的应用

在当今的科技快速发展时代&#xff0c;微电子机械系统&#xff08;MEMS&#xff09;技术已成为推动现代传感器技术革新的关键力量。MEMS压力传感器&#xff0c;作为其中的重要分支&#xff0c;广泛应用于生物医学、航空航天、汽车工业等多个领域。随着对传感器性能要求的不断提…

后台架构总结

前言 疫情三年&#xff0c;全国各地的健康码成为了每个人的重要生活组成部分。虽然过去一年&#xff0c;但是回想起来任然历历在目。 今天我就通过当时基于小程序的健康码架构&#xff0c;来给大家讲一下如何基于java&#xff0c;springboot等技术来快速搭建一个后台业务系统…

Docker基本操作 挂载数据卷

在创建一个容器的时候让容器挂载到一个数据卷: 命令:docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx 这里的数据卷如果没有提前创好会自动创建 下边是命令解析 将容器挂载到一个数据卷之后 可以在查看数据卷的目录 在数据卷的目录可以找到容器的内容…