2023 学习日志

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、页级锁

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值