2023 学习日志

2023-05-16

2023-01-03

mybatis源码学习
学习视频:https://www.bilibili.com/video/BV1Tp4y1X7FM?p=1&vd_source=cc82a52a9b9b8b31eca3aa74606e608a(这老师讲的真的很好)

分为4部分:动态代理MapperProxy、SQL会话SqlSession、执行器Executor、JDBC处理器StatementHandler

执行器
【1】简单执行器
simpleExecutor,每次执行SQL需要预编译SQL语句。
【2】可重用执行器
ReuseExecutor,同一SQL语句执行只需要预编译一次SQL语句
【3】批处理执行器
BatchExecutor,只针对修改操作的SQL语句预编译一次,并且需要手动刷新SQL执行才生效。
【4】执行器抽象类
BaseExecutor,执行上面3个执行器的重复操作,比如一级缓存、doQuery、doUpdate方法。

一级缓存命中条件
运行时参数相关:sql和参数必须相同、必须是相同的statementID(即mapper里面的方法相同)、sqlSession必须一样(会话级缓存)、RowBouds返回行范围必须相同
操作配置相关:未手动清空缓存(提交、回滚)、未配置flushCache=true、未执行update、缓存作用域不是STATEMENT

源码解析:当执行查询的时候会调用query()方法,判断是否存在缓存,存在则去PerpetualCache,里面有个HashMap;不存在则执行doQuery()方法,并且填充缓存

【5】二级缓存(应用级缓存)
定义:作用范围是整个应用,而且可跨线程使用。二级缓存有更高命中率,适合缓存修改较少的数据。
CachingExecutor,与一级缓存的区别:一级缓存查询数据库操作后会直接缓存,二级缓存需要当次数据库操作提交事务后才能进行缓存(二级缓存跨线程处理,一级缓存不用)。

源码解析:装饰器模式+责任链模式
Cache(设置缓存、获取缓存):
SynchronizedCache(线程同步)=》LogginCache(记录命中率)=》LRUCache(防溢出)=》ScheduledCache(过期清理)=》BLockingCache(防穿透)=》PerpetualCache(内存存储)

注:二级缓存优于一级缓存调用

2023-01-04

前端vue学习
现在项目用到了vue3,看了下vue3
发现原来vue3还和海贼王有关,one peace

vue3文档地址:https://cn.vuejs.org/guide/typescript/composition-api.html#typing-event-handlers
学习视频:https://www.bilibili.com/video/BV1SZ4y157m8/?spm_id_from=333.337.top_right_bar_window_history.content.click&vd_source=cc82a52a9b9b8b31eca3aa74606e608a

最直观的感受就是:
定义变量不用写到data、方法不用写到methods,直接套在setup里面就行(称之为composition API)。定义变量都可通过ref

<script setup>

</script>

然后打包方式也变了,以前是通过webpack,现在用vite

2023-01-05

微服务日志处理
【1】微服务链路追踪(接口监控)
场景:某个功能调用多个服务,需要去看哪个服务相应时间慢或者调用是否成功
解决方案:通过Sleuth,再加上Zipkin可视化查看

【2】微服务日志记录(日志监控)
场景:各个微服务都有自己的日志,日志分散
解决方案:通过ELK + Kafka。微服务将日志发送到Kafka,Kafka将日志给到Logstash,Logstatsh再将日志存储到Elasticsearch,Kibana将ES中的日志进行可视化查看

学习视频:https://www.bilibili.com/video/BV1a7411H71q?p=1&vd_source=cc82a52a9b9b8b31eca3aa74606e608a

2023-01-11

MySQL学习

  • 学习资料
    https://www.yuque.com/xuchenliang/qaqoxt
    https://www.processon.com/mindmap/60596321637689700771c679

  • 聚集索引和非聚集索引
    聚集索引是索引结构和数据一起存放的索引;非聚集索引是索引结构和数据分开存放的索引。
    CREATE CLUSTER INDEX index_name ON table_name(column_name1,column_name2,…);就是建立聚集索引
    总结
    1.使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。
    2.非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。
    3.不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好。

  • 索引类型
    主键索引、唯一索引、普通索引、全文索引
    联合索引:可以用于避免回表(覆盖索引)
    说明:普通索引会通过页级的指针来找到主键索引的主键,然后通过该主键索引找到相应的行数据

  • MySQL事物隔离级别
    1.READ-UNCOMMITTED 读未提交
    2.READ-COMMITTED 不可重复读
    这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果
    3.REPEATABLE-READ 可重复读
    MySQL的默认事务隔离级别。
    4.SERIALIZABLE 串行化

  • SQL分析
    1、慢查询日志分析(MySQL开启慢查询,并且将SQL记录到某个文件)
    2、show processlist 查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化
    3、explain分析执行计划
    select_type
    表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个 SELECT)等
    type
    表示表的连接类型,性能由好到差的连接类型为( system > const > eq_ref > ref > range > index > all)
    一般来说, 需要保证查询至少达到 range 级别, 最好达到ref
    possible_keys
    表示查询时,可能使用的索引
    key
    表示实际使用的索引
    rows
    扫描行的数量
    extra
    执行情况的说明和描述
    using index 表示MySQL将使用覆盖索引,以避免回表

  • MySQL模拟死锁
    同时执行如下两条SQL就会出现错误:[Err] 1213 - Deadlock found when trying to get lock; try restarting transaction 即数据库发现死锁
    产生原因:当事务1和事务2都开始执行,如果都执行到第一个SQL时,是不会产生死锁的,因为操作的是不同的行,此时事务1对id=1的这条记录加了独占锁,事务2对id=2的这条记录加了独占锁,由于事务都没提交,所以这两个独占锁都没有释放。
    然后两个事务都继续往下执行,我们手动控制了事务1先执行它的SQL2,即更新id=2的这条记录,由于id=2的这条记录被事务2锁着,所以这条SQL语句会被阻塞,一直等待,也就是显示的“查询时间”。
    接着事务2执行它的SQL2,即更新id=1的这条记录,又因为事务1锁着id=1的这条记录,所以,此时形成了相互等待对方持有的锁的局面,即发生了死锁。但,数据库不会任由这两个事务一直等待下去,所以事务2执行SQL2时提示死锁,“Deadlock found when trying to get lock; try restarting transaction”,事务1不受影响,commit之后事务1执行成功。
    通过看数据库状态,可以看到死锁相关信息:show ENGINE INNODB status;

-- 事务1
BEGIN;
update tabel1 set column1='1' where id=1; -- SQL1
update tabel1 set column1='1' where id=2; -- SQL2
--COMMIT

-- 事务2
BEGIN;
update table1 set column1='2' where id=2; -- SQL1
update table1 set column1='2' where id=1; -- SQL2
  • 数据库常见锁
    1、表级锁
    MyISAM非事务性存储引擎,适用于以查询为主,少量更新的应用
    2、行级锁
    InnoDB存储引擎,适用于对事务完整性要求较高的系统。InnoDB支持行级锁和表级锁,默认为行级锁。
    只有通过索引条件查询数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
    InnoDB行级锁又分为:
    (1) 共享锁:读锁,即多个事务对同一数据进行共享一把锁,都能访问到数据,但是只能读不能修改。
    (2) 排他锁:写锁,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,只有获取排他锁的事务可以对数据进行读取和修改。
    InnoDb引擎中update,delete,insert语句自动加排他锁;select …from…普通查询没有任何锁机制
    SELECT * FROM table_name WHERE … FOR UPDATE
    (3) 意向锁:InnoDB自动加的,不需用户干预。意向锁不会与行级的共享 / 排他锁互斥
    3、页级锁

    数据库中的乐观锁与悲观锁

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023 学习日志 的相关文章

  • Android Studio 一些实用的快捷键

    Alt 43 Enter 自动导入提示 Ctrl 43 点击关键字 查看源码 Ctrl 43 tab 切换代码窗口 Ctrl 43 P 显示方法参数 Ctrl 43 Alt 43 t 弹出包围结构 xff08 if xff09 Ctrl 4
  • View、自定义View

    view绘制 1 控件架构 ViewGroup作为 父控件 xff0c 可包含多个View控件 xff0c 形成控件树 上层控件负责下层子控件的测量与绘制 xff0c 并传递交互事件 2 View的测量 绘制前提 96 96 96 onMe
  • 标题栏与水平滑动界面:TabLayout、ViewPager、Fragment;;引导页:ViewPager+View

    一 1 布局中添加TabLayout 控件 xff0c 需要添加依赖 xff1b 使用相关的属性 xff0c 需要定义命名空间 compile 39 com android support design 25 0 1 39 在app下的bu
  • SharedPerference

    1 定义前的考虑 1 xff09 定义存取方式 get put 2 xff09 明确数据类型 Int String Boolean 3 定义删除功能 单个 全部 2 实现步骤 public class SharedUtil public s
  • 圆形头像CircleImageView

    头像图片来源 照相机 相册 xff1b 利用弹出的dialog进行选择 1 添加依赖包 xff0c 添加控件 xff0c 相关属性 在app下的 build gradle 中添加 xff1a compile 39 de hdodenhof
  • RxVolley进行网络请求(get方式),获取json数据

    RxVolley 是一个基于 Volley的网络请求库 项目地址 xff1a https github com kymjs RxVolley 1 添加依赖 xff1a compile 39 com kymjs rxvolley rxvoll
  • SAP 寻找增强点的方法

    SAP中寻找增强的实现方法 SAP 增强已经发展过几代了 xff0c 可参考 SAP 标准教材 BC425 和 BC427 简单的说SAP的用户出口总共有四 代 1 第一代 基于源代码的增强 SAP提供一个空代码的子过程 xff0c 在这个
  • Sublime_text2快捷键

    1 Ctrl 43 Enter 在下一行输入 xff08 添加新的下一行 xff09 2 Ctrl 43 Shift 在上一行输入 xff08 添加新的上一行 xff09 3 Ctrl 43 L 选择当前行 4 Ctrl 43 K 43 B
  • jQuery基础

    1 应用jQuery库 xff1a lt script src 61 34 路径 名称 js 34 gt lt script gt 导入 外链式css样式 xff1a lt link rel 61 34 stylesheet 34 href
  • javaScript基础

    一 浏览器对象 1 window对象 xff1a 指当前的浏览器窗口 方法 xff1a 2 定 时器 xff1a 可设定一个时间之后 xff0c 再来运行 var timer 61 setInterval function 做的事情 xff
  • JavaScript深入浅出(进阶)

    1 数据类型 js是弱类型 xff0c 定义变量时不需要指定具体的数据类型 xff0c 因此会出现一些奇妙的事情 xff1a var num 61 23 number类型 num 61 34 23 34 string类型 34 23 34
  • H5

    一 总体变化 1 H5文档结构 span style font family SimSun font size 18px lt DOCTYPE html gt lt html gt lt head gt lt title gt 这是标题 l
  • JavaScript进阶之--DOM事件、动画(运动框架)

    DOM事件 一 事件流 描述的是从页面中接收事件的顺序 当你点击一个容器里的子控件时 xff0c 默认同时也点击了这个父容器 事件冒泡 ie xff1a 事件最开始由最具体的元素接收 xff0c 然后逐级向上传播到最不具体的结点 子 父 祖
  • CSS3基础与进阶

    一 CSS3新增的选择器 1 属性选择器 1 xff09 att 61 39 val 39 属性att的值以 34 val 34 开头的元素 2 xff09 att 61 39 val 39 结尾 3 xff09 att 61 39 val
  • macbook pro 识别不到外接显示器

    背景 最近在公司和家都用到外接显示器 回到家后合上mac 外接也跟着没信号了 重启后直接不识别了 机型macbookpro15 2018 系统版本10 15 4 1 确保 线材 外接显示器都没有问题 找其他电脑测试 2 不勾选 再次登录时重
  • cisco anyConnect 不用每次输入密码的办法

    opt cisco anyconnect bin vpn s connect HOST ADDRESS lt lt 34 EOF 34 VPN USERNAME VPN PASSWORD y EOF 可保存为sh 直接运行
  • Python 3.7 有什么新变化 - 其他语言更改&新模块

    其他语言更改 await 表达式和包含 async for 子句的推导在格式化字符串文本中的表达式中是非法的 xff0c 因为 实现 在Python 3 7中 xff0c 这个限制被取消了 现在可以将超过 255 个参数传递给函数 xff0
  • Oracle Systimestamp 函数

    在Oracle PLSQL中 xff0c Systimestamp 函数返回本机数据库上当前系统日期和时间 包括微秒和时区 Systimestamp 函数的语法是 xff1a systimestamp 应用于 xff1a Oracle 9i
  • 如何在Centos下卸载OpenJDK,安装Oracle JDK

    写在前面 一般Linux系统都会自带JDK xff0c 只不过是Open JDk xff0c 而我们开发一般使用的是Oracle JDK xff0c 所以我们需要写在Open JDK xff0c 进而安装Oracle JDK 一 卸载Ope
  • Python 3.6 有什么新变化 - 新功能&新模块

    PEP 498 xff1a 格式化字符串文本 PEP 498 引入了一种新的字符串文本 xff1a f 字符串或格式化字符串文本 格式化字符串文本以 和 类似 str format xff08 xff09 接受的格式字符串 它们包含替换 由

随机推荐