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 ';') name
        from sys_data_develop_db_input dbInput
        where 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
    @Async
    public 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测试结果如图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

maven修改默认编码格式为UTF-8

执行mvn -version查看maven版本信息发现&#xff0c;maven使用的编码格式为GBK。 为什么想到要修改编码格式呢&#xff1f;因为idea中我将文件格式统一设置为UTF-8&#xff08;如果不知道如何修改文件编码&#xff0c;可以参考文末&#xff09;&#xff0c;然后使用maven打包时…

ubuntu22 部署fastDFS单节点和集群,整合Spring Boot(刚部署成功)

ubuntu22 部署fastDFS单节点和集群 一、先准备1、所需依赖安装2、下载安装包 二、安装FastDFS单节点1、libfastcommon安装1.1、创建软连接 2、安装fastDFS2.1、fastDFS目录简单介绍2.2、创建软连接 3、配置和启动Tracker服务3.1、修改Tracker配置文件3.2、启动Tracker 4、配置和…

字节码插桩 -- 入门篇

背景 我们先了解下什么情况下会用到字节码插桩。学技术并不是为了秀技术&#xff0c;而是为了解决业务问题。 我们先想象一个业务场景— 我们需要统计耗时方法&#xff0c;这时&#xff0c;我们会怎么做&#xff1f; 在每个方法开头和结尾处分别记录开始时间与结束时间&…

学生管理系统[Python语言]

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 学生管理系统是计算机专业最基础的一个作业&#…

高扬程水泵,提升水源新选择!— 恒峰智慧科技

在炎炎夏日&#xff0c;阳光炙烤着大地&#xff0c;森林火灾的发生频率也随之上升。火势猛烈&#xff0c;烟雾弥漫&#xff0c;给森林带来了极大的破坏。为了保护森林资源&#xff0c;我们必须采取有效的措施来扑灭火灾。而在这其中&#xff0c;高扬程水泵成为了提升水源新选择…

智慧旅游驱动行业革新:智能技术引领服务全面升级,匠心打造高品质、个性化旅游新体验

一、引言 随着科技的飞速发展和信息化程度的不断提高&#xff0c;智慧旅游正逐渐成为旅游业发展的新趋势。智慧旅游&#xff0c;顾名思义&#xff0c;是以智能化技术为支撑&#xff0c;通过大数据、云计算、物联网、人工智能等先进技术的应用&#xff0c;实现旅游服务的全面升…

Java项目:基于SSM框架实现的实践项目管理系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的实践项目管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff…

BIMBase浏览器新功能——碰撞检测

BIMBase浏览器&#xff08;原BIMBase建模软件 Lite&#xff09;全新R1.14版本已经全面上线&#xff0c;新版本下载链接&#xff1a;BIMBase浏览器R1.14。本次给大家介绍一下本次版本的重点功能&#xff1a;碰撞检测。 各位设计院/施工单位/运维单位的伙伴们在模型交付、方案讨论…

第三节课,功能2:开发后端用户的管理接口5min(用户的查询/状态更改)【4】【9开始--本人】

一、代码任务 【录个屏】 二、写代码 2.1 代码文件位置 2.2 代码如下&#xff1a; 2.3 官方文档&#xff1a; 网址&#xff1a; 逻辑删除 | MyBatis-Plus (baomidou.com) 三、代码有bug&#xff0c;没有鉴权&#xff0c;表里添加一个字段。role 管理员 3.1 判断操作的人&am…

【开发工具】pythontutor——在线内存可视化工具

笔者在学习RISC-V时&#xff0c;希望找到一款可视化的内存工具&#xff0c;遗憾目前还未找到。发现了pythontutor这个网站&#xff0c;可以对C、python等多种语言进行内存可视化。结果似乎是x86架构的&#xff0c;符合小端存储。 贴一下网址&#xff0c;原准备依据开源版本进行…

什么是MOM?为什么它是趋势

制造运营管理&#xff08;MOM&#xff09; 制造运营管理&#xff08;MOM&#xff09;旨在优化制造流程的效率和有效性。它涵盖制造执行、质量管理、生产计划和调度以及制造智能等功能。这种解决方案以全面的方式管理和增强制造流程。 MOM的功能特点 对于MOM的功能特点来说&…

爬虫自动调用shell通过脚本运行scrapy爬虫(crawler API)

一、爬虫时如何同时调用shell 1)终端cd项目>>scrapy crawl example 2)打开example.py import scrapy from scrapy.shell import inspect_response#引入shellclass ExampleSpider(scrapy.Spider):name "example"allowed_domains ["example.com"]…

兄弟们,哪一家做智慧校园的公司比较靠谱?

开发技术参数 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语言开发 4、电子班牌固件安卓7.1&#xff1b;使用Java Android原生 5、elmentui &#xff0c;Quartz&#xff0c;jpa&#xff0c;jwt 6、SaaS云平台&#xff0c;私有云部署…

iview 自定义项求和的方法和错误点

这是iview自定义某几项参数合计的方法&#xff0c;其实是蛮简单的&#xff0c;很多人自定义合计的时候&#xff0c;老是会不知道怎么处理除了需要合计的几项的其他项&#xff0c;其实不需要管&#xff0c;不需要合计的项直接返回空就好了&#xff0c;需要的就在计算的里面做key…

Llama 3 ——开源大模型Llama 3从概念到使用

概述 Meta公司自豪地宣布推出其最新的开源大型语言模型——Llama 3&#xff0c;这是一款专为未来AI挑战而设计的先进工具。Llama 3包含两个不同参数规模的版本&#xff0c;以满足多样化的计算需求&#xff1a; 8B版本&#xff1a;优化了在消费级GPU上的部署和开发流程&#xf…

初识MVC

初识MVC 理论部分 今天第一次学MVC&#xff0c;拿到一个练手项目。现在来记录一下学习过程。 项目的背景就是个学生管理系统。我只做后端。 从大的来说MVC将应用程序分为三个主要组件&#xff08;部分&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;是应用程序…

SGP.31-05

6.1.1 eIM触发下载过程 6.1.2 eIM Initiated Direct Profile Download with SM-DS 在文档的“6.1.2 eIM 发起的通过 SM-DS 的直接配置文件下载”部分&#xff0c;描述了两种直接从 SM-DP 到 eUICC 的配置文件下载选项。以下是每个步骤的概述&#xff1a; ### 开始条件&…

​基于Python的在线自主评测系统(django)​

基于Python的在线自主评测系统(django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 学生功能模块的实现 学生注册的实现 学生登录界面首页 在线考试界面 考试成绩查看界面 教师功能模块的实现 新建…

以全栈智算拥抱生态,为AIGC种一棵向上生长的巨榕

榕树&#xff0c;被称为百木之王。它既有极深的根&#xff0c;又有繁茂的叶。只要一棵榕树长成&#xff0c;就能够独木成林&#xff0c;遮天蔽日。更可贵的是&#xff0c;榕树可以为树荫下繁茂的生态提供支撑&#xff0c;形成“一榕生&#xff0c;万物长”的格局。 开年以来&am…

MySQL中SELECT语句的执行过程

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