- 博客(57)
- 收藏
- 关注
原创 第 3 章 事务处理
事务处理几乎在每一个信息系统中都会涉及,它存在的意义是为了保证系统中所有的数据都是符合期望的,且相互关联的数据之间不会产生矛盾,即数据状态的一致性(Consistency)。
2025-04-04 17:44:38
1106
原创 第 1 章 服务架构演进史
调用远程方法面临的问题与解决方案:单体架构:系统中主要的过程调用都是进程内的,不会发生进程间通信。优点缺点由于所有代码都运行在同一个进程空间之内,意味着如果任何一部分代码出现了缺陷,过度消耗了进程空间内的资源,所造成的影响也是全局性的,难以隔离的。譬如内存泄漏、线程爆炸、阻塞、死循环等问题,都将会影响整个程序。同样的原因,单体架构无法做到单独停止、更新、升级某一部分代码等操作(通过 OSGi 这种运行时模块化框架可以实现),所以从可维护性来说,单体系统也是不占优势的。
2025-01-26 16:51:11
1506
原创 第 4 章 高级主题
SpringMVC是Spring提供的一个强大而灵活的Web框架,它是一款实现了MVC设计模式的、请求驱动的轻量级Web框架。MVC(Model-View-Controller,模型-视图-控制器)架构模式,Model主要负责封装需要在视图上展示的数据;View只用于展示数据,不包含任何业务逻辑;Controller主要负责接收用户的请求,调用底层的Service层执行具体的业务逻辑。MVC通过分离模型、视图和控制器实现业务逻辑与界面之间的解耦。
2025-01-20 14:55:14
887
原创 第 3 章 核心处理层(下)
一级缓存是会话级别的缓存,在MyBatis中每创建一个SqlSession对象,就表示开启一次数据库会话。MyBatis通过在Executor对象中建立一个简单的缓存来实现“一级缓存”。它会将每次查询的结果对象缓存起来,在执行查询操作时,会先查询一级缓存,如果其中存在完全一样的查询语句,则直接从一级缓存中取出相应的结果对象并返回给用户,避免访问数据库,降低了数据库的压力。一级缓存的生命周期与SqlSession相同,但其中的缓存对象的对象存活时间受很多方面影响。
2025-01-20 14:52:15
871
原创 第 3 章 核心处理层(中)
StatementHandler接口是MyBatis的核心接口之一,它的功能很多,例如创建Statement对象,为SQL语句绑定实参,执行select、insert、update、delete等多种类型的SQL语句,批量执行SQL语句,将结果集映射成结果对象。cglib采用字节码技术实现动态代理功能,其原理是通过字节码技术为目标类生成一个子类,并在该子类中采用方法拦截的方式拦截父类方法的调用,从而实现代理的功能。语句并不会返回自动生成的主键,而是返回插入记录的条数。
2025-01-20 14:50:16
1046
原创 第 3 章 核心处理层(上)
MyBatis中涉及的OGNL表达式的功能主要是:存取Java对象树中的属性、调用Java对象树中的方法OGNL表达式有三个重要概念:表达式OGNL表达式执行的所有操作都是根据表达式解析得到的。例如:“对象名.方法名”表示调用指定对象的指定方法。深入学习请参考:(root对象OGNL表达式指定了具体的操作,而root对象指定了需要操作的对象OgnlContext(上下文对象)OgnlContext类继承了Map接口,可以存放除root对象之外的其他对象。
2025-01-20 14:48:48
1372
原创 第 2 章 基础支持层(下)
基础支持层位于MyBatis整体架构的最底层,支撑着MyBatis的核心处理层,是整个框架的基石。基础支持层中封装了多个较为通用的、独立的模块,不仅仅为MyBatis提供基础支撑,也可以在合适的场景中直接复用 。
2024-10-10 09:53:52
1226
原创 第 2 章 基础支持层(上)
基础支持层位于MyBatis整体架构的最底层,支撑着MyBatis的核心处理层,是整个框架的基石。基础支持层中封装了多个较为通用的、独立的模块,不仅仅为MyBatis提供基础支撑,也可以在合适的场景中直接复用 。
2024-10-10 09:51:44
1455
原创 第 1 章 MyBatis快速入门
ORM(Object Relational Mapping,对象——关系映射)框架的主要功能是根据映射配置文件,完成数据在对象模型与关系模型之间的映射,同时出屏蔽了连接数据库、创建 Statement 对象、执行 SQL、读取 ResultSet、转换 JavaBean、关闭 ResultSet、Statement 对象以及数据库连接等操作。
2024-10-08 15:01:38
947
原创 MySQL GROUP_CONCAT函数踩坑小记
以上 SQL,由于 bic.id 是不可能等于0的,所以结果集中应该没有数据。显然这会导致最终的结果集中出现一个所有字段都 NULL 的元素,造成可能的 NPE。有长度限制,默认1024,如果你尝试连接的字符串超过这个长度,结果就会被截断。
2024-10-06 12:32:56
508
原创 Javascript客户端时间与服务器时间
这样,就可能会出现一个问题:我的电脑时间比正常时间要快,我访问一个页面,初始化打开时,默认 make_date 在 js 中使用 new Date() 生成,值是我电脑的时间。等页面提交,使用 Java 代码new Date() 生成 check_date,值是服务器时间。但是在Javascript 中使用new Date(),获取的却是访问该页面的客户端时间。在Java代码中使用new Date(),获取的是本机时间;为了解决这个问题,在js中使用如下代码获取服务器时间。
2024-10-06 12:03:48
589
原创 解决JavaScript 数学运算精度丢失的问题
JavaScript 中执行浮点数运算时可能会遇到精度丢失的问题。这通常是因为浮点数的表示遵循IEEE 754标准,而这种表示法只能精确地表示有限的数字。对于大多数程序员来说,这不是一个问题,因为它允许计算机处理超出精度范围之外的数字。然而,如果需要高精度的计算结果,例如货币计算,就需要采取措施避免精度丢失。
2024-10-06 12:00:23
320
原创 jquery on() 函数绑定无效
on 前面的元素必须在页面加载的时候就存在于 dom 里面。动态的元素或者样式等,可以放在 on 的第二个参数里面。
2024-10-06 11:48:08
441
原创 幂等性接口实现
幂等(idempotence),这个词源自数学,幂等性是数学中的一个概念,常见于抽象代数中。表达的是N次变换与1次变换的结果相同。简单来说,就是如果方法调用一次和调用多次产生的效果是相同的,它就具有幂等性。幂等函数或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数,这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
2024-10-06 11:41:42
914
原创 第 4 章 Spring IoC容器之BeanFactory
Spring 的 IoC 容器是一个提供 IoC 支持的轻量级容器,除了基本的 IoC 支持,它作为轻量级容器还提供了 IoC 之外的支持。和BeanFactory 肯定会公开一个取得组装完成的对象的方法接口。
2024-10-06 11:38:02
854
原创 第 22 章 工作面试老大难——锁
MVCC 和加锁是解决并发事务带来的一致性问题的两种方式共享锁(S锁)、独占锁(X)锁,共享锁与共享锁兼容,独占锁不与其他锁兼容事务利用 MVCC 进行的读取操作称为一致性读;在读取记录前加锁的读取操作称为锁定读(有特定写法)IS、IX是表级锁,以便快速判断表中的记录是否有被上锁InnoDB 的行级锁有多种类型InnoDB 的锁结构infomation_schema 库下有关于事务的锁的表死锁。
2024-10-04 11:08:32
1178
原创 第 21 章 一条记录的多幅面孔——事务的隔离级别与 MVCC
并发的事务在运行过程中会出现一些可能的引发一致性问题SQL 标准中有4种隔离级别版本链ReadView。
2024-10-02 22:25:35
1160
3
原创 第 20 章 后悔了怎么办——undo log
undo log 记录了回滚一个操作所有的必要内容,保证了事务的原子性不同的场景有不同的 undo log 类型类型为 FIL_PAGE_UNDO_LOG 的页面是专门用来存储 undo log 的,称为 Undo Page。一个事务最多分配4个链表每个 Undo Page 链表都对应一个 Undo Log Segemnt同一个事务向一个 Undo Page 链表中写入的 undo log 算一个组Undo Page 链表可以被重用。
2024-09-30 13:40:56
1069
原创 流水标准化处理器
虽然不同银行的流水格式有所差异,但解析流水时,我们所关注的要素其实是固定的。传统方式处理银行流水时,由于不同的银行,流水格式不尽相同,需要针对不同银行构建不同的处理器(Handler)分别处理,导致系统耦合性高且可拓展性低。每接入一家银行,流水标准化处理器会自动通过这家银行的流水,利用 AI 将基格式化为一条标准配置,再基于标准配置进行处理,而不需要另外进行开发。每接入一家银行,流水标准化处理器会自动通过这家银行的流水,利用 AI 将基格式化为一条标准配置,再基于标准配置进行处理,而不需要另外进行开发。
2024-09-29 13:33:43
264
原创 第 19 章 说过的话就一定要办到——redo log
redo 日志记录了事务执行过程中都修改了哪些内容事务提交只将执行过程中产生的 redo 日志刷新到磁盘,而不是将所有修改过的页面都刷新到磁盘一个 mtr 可以包含一组 redo 日志,它们是一个整体不可分割redo 日志存放在大小为512字节的 block 中redo 日志缓冲区是一片连续的内存空间,由若干个 block 组成redo 日志文件组由若干个日志文件组成,每个日志文件大小一样,格式一样,循环使用lsh 指已经写入的 redo 日志量;
2024-09-29 13:28:34
1329
原创 第 18 章 从猫爷借钱说起——事务简介
事务指需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作事务的执行状态包括活动的、部分提交的、提交的、失败的、中止的。
2024-09-28 11:44:12
520
原创 第 17 章 调节磁盘和CPU的矛盾——InnoDB的Buffer Pool
MySQL 服务器启动时申请的用来缓存磁盘中的页的连接内存,叫做 Buffer Pool。默认 128 M,通过参数来调节它的大小。磁盘太慢,用内存作为缓存很有必要Buffer Pool 本质上是 InnoDB 向操作系统申请的一段连续的内存空间,可能通过来调整它的大小Buffer Pool 向操作系统申请的连续内存块由控制块和缓存页组成,它们一一对应。free 链表:Buffer Pool 中的空闲页使用表空间号 + 页号作为 key,缓存页作为 value 建立哈希表,以快速定位某个页。
2024-09-27 11:21:41
1158
原创 第 16 章 神兵利器——optimizer trace 表的神器功效
optimizer trace 功能可以让我们方便地查看优化器生成执行计划的整个过程。
2024-09-24 17:33:01
259
原创 第 14 章 不好看就要多整容——MySQL 基于规则的优化(内含关于子查询优化二三事儿)
MySQL 会对用户编写的 SQL 执行一些重写操作在被驱动表的 WHERE 子句符合空值拒绝条件时,外连接和内连接可以相互转换子查询按照不同的维度可以进行分类子查询的优化策略及半连接查询。
2024-09-15 14:40:07
879
原创 第 13 章 兵马未动,粮草先行——InnoDB 统计数据是如何收集的
InnoDB 以表为单位来收集统计数据,可以是基于磁盘的永久性数据,也可以是基于内存的非永久性数据。
2024-09-15 14:35:52
910
原创 第12章 谁最便宜就选谁——MySQL基于成本的优化
I/O 成本当我们想查询表中的记录时,需要先把数据或者索引从磁盘加载到内存中再操作。CPU 成本读取以及检测记录是否满足对应的搜索条件、对结构集进行排序等这些操作损耗。对于InnoDB来说,页是磁盘和内存之间交互的基本单位。MySQL规定读取一个页面花费的成本默认是1.0,读取以及检测一条记录是否符合搜索条件的成本默认是0.2。这两个称为成本常数。单次查询驱动表的成本多次查询被驱动表的成本扇出:驱动表进行查询后得到的记录条数。
2024-09-09 11:02:52
996
1
原创 第 11 章 两个表的亲密接触——连接的原理
连接的本质就是把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户。如果没有连接条件,就会产生笛卡尔集涉及单表的条件比如 t1.m1 > 1 或者 t2.n2 < ‘d’涉及两表的条件比如 t1.m1 = t2.m2连接分为内连接和外连接,外连接又分为左外连接和右外连接。嵌套循环连接算法是指驱动表只访问一次,被驱动表可能访问多次。如果被驱动表非常大,多次访问可能导致多次I/O,可以使用基于块的嵌套循环连接算法来缓解由此造成的性能损耗。
2024-09-09 10:49:35
833
原创 第 9 章 存放页面的大池子——InnoDB的表空间
不同类型的页面有不同的功能,但都有 File Header 和 File Trailer 的通用结构。表空间被划分为许多连续的区,每个区默认64个页,每256个区为一组,每组最开始几个页面的类型是固定的。段是一个逻辑上的概念,是某些零散的页面以及一些完整的区的集合。每个区对应一个 XDES Entry 结构。每个段对应一个 INODE Entry 结构。表空间中第一个页面的类型是 FSP_HDR,它存储了表空间的一些整体属性以及第一个组内256个区对应的 XDES Entry 结构。
2024-09-02 10:39:23
911
原创 第 8 章 数据的家——MySQL的数据目录
mysql:存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。information_schema:保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引等等,这些并不是真实的用户数据,而是一些描述性信息,也被称为元数据。performance_schema:保存MySQL服务器运行过程中的一些状态信息,包括最近执行了哪些语句、执行耗时、内存使用情况等。
2024-08-30 22:53:16
951
原创 第 7 章 B+树索引的使用
B+树索引在空间和时间上都有代价,使用时要有敬畏之心B+树索引适用以下情况全值匹配匹配左边的列匹配范围值精确匹配某一列并范围匹配另外一列排序分组在使用索引时,需要注意只为用于索引、排序或分组的列创建索引为列的基数大的列(选择性强)的列创建索引索引列的类型尽量小可以只对字符串值的前缀建立索引只有索引列在比较表达式中单独出现才有效为了避免页面分裂和记录移位,使用主键自增避免重复和冗余索引尽量使用覆盖索引,避免回表。
2024-08-28 23:15:28
712
原创 第 6 章 快速查询的秘籍——B+树索引
MyISAM的索引方案同样使用树形结构,但是却将索引和数据分开存储。将表中的记录按照记录的插入顺序单独存储在一个文件中,称为数据文件。MyISAM存储引擎会把索引信息存储到另外一个索引文件中,先通过索引找到对应的行号,再通过行号去找对应的记录。也就是相当于InnoDB中的二级索引。InnoDB存储引擎的索引是一棵B+树,完整的用户记录都存储在B+树第0层的叶子,其他层次的内节点存储的是目录项记录InnoDB的索引分为聚簇索引和二级索引MyISAM存储引擎的数据和索引分开存储,都是二级索引。
2024-08-25 23:50:46
691
原创 第 5 章 盛放记录的大盒子——InnoDB数据页结构
InnoDB为了不同的目的设计了许多不同类型的页。InnoDB为了不同的目的设计了不同类型的页。一个数据页可以被大致分为7个部分每个记录的头信息中都有一个属性,形成一个单链表。InnoDB会把页中的记录划分为若干个组,每个组的最后一个记录的地址偏移量作为一个槽,存放在Page Directory中。每个数据页的File Header部分都有上一个和下一个页的编号,形成一个双链表。为保证从内存中同步到磁盘的页的完整性,页的尾部会进行二次校验。
2024-08-23 16:27:21
687
原创 第 4 章 从一条记录说起——InnoDB记录存储结构
将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB 中页的大小一般为 16KB。也就是在一般情况下,一次最少从磁盘中读取 16KB 的内容到内存中,一次最少把内存中的 16KB 内容刷新到磁盘中。页是MySQL中磁盘和内存交互的基本单位,也是MySQL管理存储空间的基本单位。可以指定和修改行格式。InnoDB定义了4种行格式,分别是Compact、Redundant、Dynamic和Compressed。一个页一般是16KB,当记录太大时,会发生行溢出。
2024-08-21 00:06:55
612
原创 第 3 章 乱码的前世今生——字符集和比较规则
字符集:人们抽象出来的用来描述某个字符范围的编码规则。如何比较两个字符,最简单的方法是直接比较两个字符对应的二进制编码大小。但很多情况下并不适用。字符集指的是某个字符范围的编码规则比较规则是对某个字符集的字符比较大小的一种规则在 MySQL 中,一个字符集可以有多个比较规则。
2024-08-18 23:48:44
334
原创 第 2 章 MySQL的调控按钮——启动选项和系统变量
- SHOW VARIABLES [LIKE 匹配的模式] SHOW VARIABLES LIKE 'default_storage_engine';略。
2024-08-17 00:54:49
257
原创 编码与解码
字符集编码和解码是计算机处理文本数据的基础过程。这个过程涉及到两个主要的概念:字符集(Character Set)和字符编码(Character Encoding)。字符集(Character Set):字符集是一个定义了一组字符和它们对应的数字的系统。例如,ASCII字符集定义了128个字符,包括英文字母、数字、标点符号等,每个字符都对应一个0到127之间的数字。字符编码(Character Encoding):字符编码是一种将字符集中的字符转换为可以在计算机中存储和传输的二进制形式的方法。
2024-07-12 10:51:02
1128
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人