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.mzph.cn/news/830475.shtml

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

相关文章

Mysql基础(四)DML之insert语句

一 insert 语句 强调&#xff1a; 本文介绍的内容很基础,仅做记录用,参考价值较少 ① 总述 目的&#xff1a; 增加rows记录1、完整格式insert [into] 表名[字段名1[, 字段名2]] value[s](值1, 值2);备注&#xff1a;指定部分字段添加,没有被指定的字段要么会自动增长,要…

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取&#xff0c;支持 InnoDB、MyISAM、Memory 等多个存储引擎&#xff0c;MySQL5.5以后默认使用InnoDB&#xff0…

Nacos、OpenFeign、网关 笔记

一、远程调用 1.1配置RestTemplate配置类 package com.hmall.cart.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;Configuration public c…

【06016传感器原理与应用】第3章 力学量传感器 期末复习自考复习

第3章 力学量传感器 定义&#xff1a;将力/压力等力学量信号变成电信号的装置 称为力学量传感器。 力学传感器的分类&#xff1a; 应用普遍的&#xff1a;电阻式、压电式、电容式、电感式、谐振式、变磁阻式、光纤式等等。传统的如弹簧&#xff1a;成本低、不需电源&#xff…

Docker-compose的介绍与用法

Docker-compose Docker Compose 是一个开源的容器编排工具&#xff0c;由 Docker 官方开发。它允许开发者定义一个或多个 Docker 容器作为单个服务&#xff0c;并将这些服务组合成一个项目。这些定义被保存在一个 YAML 文件中&#xff0c;称为 docker-compose.yml。 使用 Dock…

C#命名空间常用函数

在C#中&#xff0c;不同命名空间下有各种常用函数&#xff0c;下面列举一些常见的函数及其对应的命名空间&#xff1a; System命名空间&#xff1a; Console.WriteLine()&#xff1a;用于向控制台输出信息。Convert.ToInt32()&#xff1a;用于将其他数据类型转换为整数类型。 S…

个人图床解决方案(PicGo+对象存储, 几乎免费)

个人图床解决方案(PicGo对象存储) 原先我的解决方案是github做图床,套一层Cloudflare的cdn来加速国内访问, 但国内访问仍然过慢, 特别是一些图很多的文章, 加载非常慢. 所以我想着改善一下, 在对比了一些解决方案之后, 我选择了PicGo缤纷云搭建主图床, 部分图片放在 去不图床,…

在STM32上实现嵌入式人工智能应用

引言 随着微控制器的计算能力不断增强&#xff0c;人工智能&#xff08;AI&#xff09;开始在嵌入式系统中扮演越来越重要的角色。STM32微控制器由于其高性能和低功耗的特性&#xff0c;非常适合部署轻量级AI模型。 本文将探讨如何在STM32平台上实现深度学习应用&#xff0c;…

JAVA:maven-->>检查 所有依赖 与 环境 兼容

内容 为了确保你项目中的所有依赖都彼此兼容&#xff0c;并与你的环境相适应&#xff0c;你可以利用 Maven 的依赖管理功能。Maven 有助于解决、升级&#xff0c;并对齐所有库的版本&#xff0c;以避免任何不一致或冲突。以下是检查兼容性的步骤&#xff1a; ### 检查兼容性的…

Elasticsearch 索引的分片和副本是什么意思,如何扩展分片

文章目录 前言Elasticsearch 索引的分片和副本是什么意思&#xff0c;如何扩展分片示例:1. 设置 5个分片&#xff0c;每个分片一个副本的命令2. 将5个分片扩展到10个分片 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求&#xff0c;并且请求同…

Qt下使用7Z源码进行压缩和解压缩

7Z压缩是一款常用的压缩算法和工具&#xff0c;本文主要介绍一款在qt环境下进行编译的压缩方法。 本人测试是可以正常跑通的&#xff0c;具体代码部分请下载&#xff1a;下载链接&#xff0c;提取码&#xff1a;ev9t 7z源码网址&#xff1a;7-Zip 7z简介&#xff1a; 7z 是…

Python多线程并不是真的并行执行

Python多线程虽然能够利用多个CPU核执行计算&#xff0c;但并不能真正执行多线程并行计算。因为在Python中&#xff0c;有一个全局解释锁&#xff08;GlobalInterpreter Lock&#xff0c;GIL&#xff09;&#xff0c;该锁的存在使得在同一个时间只有一个线程执行任务&#xff0…

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时&#xff0c;出现错误和没有信息的情况。 原因 rocketmq控制台版本问题&#xff0c;最新版本为1.0.1&#xff0c;支持rocketmq5版本&#xff0c;如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…

Spark AQE 导致的 Driver OOM问题

背景 最近在做Spark 3.1 升级 Spark 3.5的过程中&#xff0c;遇到了一批SQL在运行的过程中 Driver OOM的情况&#xff0c;排查到是AQE开启导致的问题&#xff0c;再次分析记录一下&#xff0c;顺便了解一下Spark中指标的事件处理情况 结论 SQLAppStatusListener 类在内存中存…

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

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

读天才与算法:人脑与AI的数学思维笔记14_人脑的极限

1. 数学研究 1.1. 数学研究变得更为艰难了 1.1.1. 学科分支越发密集&#xff0c;问题越发复杂 1.1.2. 攻读博士学位的3年时间&#xff0c;只够去理解导师所给题目的含义 1.1.3. 随后&#xff0c;再花费数年时间去研究、探索&#xff0c;运气不错的话&#xff0c;会得到一些…

CVE-2022-2602:unix_gc 错误释放 io_uring 注册的文件从而导致的 file UAF

前言 复现该漏洞只是为了学习相关知识&#xff0c;在这里仅仅做简单记录下 exp&#xff0c;关于漏洞的详细内容请参考其他文章&#xff0c;最后在 v5.18.19 内核版本上复现成功&#xff0c;v6.0.2 复现失败 漏洞利用 diff --git a/include/linux/skbuff.h b/include/linux/s…

10GMAC层设计系列-(1)10G Ethernet PCS/PMA

一、引言 对于10G以太网MAC层的实现&#xff0c;Xilinx提供了 3种IP核&#xff0c;分别是 10G Ethernet MAC、10G Ethernet PCS/PMA、10G Ethernet Subsystem。 10G Ethernet MAC只包含MAC层&#xff0c;外部需要提供一个PHY芯片进行数据对齐&#xff0c;10G Ethernet MAC与P…

软考 系统架构设计师系列知识点之软件可靠性基础知识(7)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;6&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第1节 软件可靠性基本概念 9.1.5 广义的可靠性测试和狭义的可靠性测试 广义软件可靠性测试 广义的软件可靠性测试是…