本文共 2325 字,大约阅读时间需要 7 分钟。
数据库锁机制与 MySQL 索引优化
1. 数据库锁机制
数据库锁是一种用于协调多个进程或线程对数据库资源的并发访问控制机制,主要用于防止数据竞争和 DEADLOCK(死锁)问题。
1.1 锁的类型
从数据操作粒度分:
- 表锁:锁定整个表,开销小,加锁快,不容易出现死锁,但锁定粒度大,发生锁冲突概率高。
- 行锁:锁定当前操作行,开销大,加锁慢,容易出现死锁,但锁定粒度最小,锁冲突概率最低。
从数据操作类型分:
- 读锁(共享锁):允许多个读操作同时进行,不会互相影响。
- 写锁(排他锁):当前操作未完成之前,阻断其他写锁和读锁。
1.2 乐观锁与悲观锁
乐观锁:假设数据不会被其他进程修改,通常通过 CAS(比较与交换)自旋算法实现。
悲观锁:假设数据可能被其他进程修改,在获取数据时先加锁,确保数据不变。
乐观锁适用于读多写少的场景,而悲观锁通常用于需要精确控制并发访问的高并发系统。
2. SpringMVC 工作原理及重要组件
SpringMVC 是一个基于 MVC 设计模式的轻量级 Web 框架,通过 DispatcherServlet 处理用户请求。
2.1 SpringMVC 请求处理流程
用户发起 HTTP 请求,DispatcherServlet 处理请求。 HandlerMapping 查找相应的处理器(Handler)。 HandlerExecutionChain 构建执行链。 DispatcherServlet 调用 HandlerAdapter 执行处理器。 处理器 返回 ModelAndView。 DispatcherServlet 渲染视图并返回响应。 2.2 DispatcherServlet 的作用
- 作为前端控制器,负责请求分派和流程调度。
- 支持文件上传、异步请求、国际化等功能。
2.3 SpringMVC 重要组件
- DispatcherServlet:前端控制器,负责请求分发。
- HandlerMapping:处理器映射器,根据请求映射处理器。
- ViewResolver:视图解析器,解析逻辑视图名为物理视图。
3. Spring 核心概念
Spring 的核心是 IOC(控制反转)和 AOP(面向切面编程)。
3.1 IOC
通过动态配置和反射创建对象,减少手动编码,实现松耦合。
- bean 的生命周期:实例化、属性赋值、初始化、销毁。
3.2 AOP
通过动态代理实现日志记录、事务管理等切面功能。
- 使用 AspectJ 实现动态代理,支持 JDK 样式代理和 CGILIB 样式代理。
4. MyBatis 缓存机制
MyBatis 提供两级缓存,主要用于减少数据库查询次数。
4.1 一级缓存
- 层级:SqlSession 级别。
- 特点:默认开启,缓存粒度小。
- 缺点:会话关闭时缓存失效。
4.2 二级缓存
- 层级:Mapper XML 级别。
- 特点:默认关闭,缓存粒度大。
- 缺点:集群环境下容易出现一致性问题。
4.3 缓存执行顺序
二级缓存优先级高于一级缓存。 在同一个 SqlSession 中,优先查二级缓存。 一级缓存数据会在会话提交或关闭时同步到二级缓存。 5. Spring Boot 使用感受
Spring Boot 提供了一键集成的功能,简化了配置管理。
5.1 常用注解
@SpringBootApplication:标注主应用类。 @RestController:标注 RESTful 控制器。 @Component:标注 Spring 组件。 @Autowired:通过依赖注入获取Bean。 @EnableAutoConfiguration:开启 Spring Boot 自动配置。
6. Linux 命令
tail -f:实时查看日志。 vi:编辑文档。 ps -ef:查看进程。 netstat:查看网络统计信息。 ping:测试网络连通性。 find:查找文件。 grep:文本搜索。
7. Lambda 表达式
Lambda 表达式是一种匿名函数,可以直接传递给接收者方法作为参数。
- 优点:简化代码,提升可读性。
- 缺点:可能导致代码难以调试和维护。
8. 线程池
8.1 七大参数
corePoolSize:核心线程数。 queueCapacity:任务队列容量。 maxPoolSize:最大线程数。 keepAliveTime:线程空闲时间。 rejectedExecutionHandler:任务拒绝处理器。
8.2 拒绝策略
- 排队策略:将任务加入队列,等待核心线程空闲。
- 直接拒绝:立即拒绝任务,适合不重要任务。
- 抢占策略:强制获取一个核心线程。
- 返回服务:允许任务返回服务继续执行。
9. MySQL 三大范式
- 1NF:原子性(每个字段存储一致的值)。
- 2NF:消除部分依赖(非主属性不能依赖主属性)。
- 3NF:消除传递依赖(非主属性不能依赖其他非主属性)。
10. 索引失效情况
- 违反最左前缀法则。
- 范围查询右边列索引失效。
- 字符串不加引号。
- 索引列进行运算。
- 头部模糊匹配。
- 使用
!= 或 <> 运算符。
11. Spring 中设计模式
- 工厂模式:创建 BeanFactory。
- 模板模式:提供通用处理流程。
- 代理模式:动态代理实现切面功能。
- 策略模式:资源加载策略。
- 单例模式:控制 Bean 的创建单例。
- 观察者模式:通知机制。
- 适配器模式:适应不同接口。
12. 延迟加载
- 场景:数据库查询、文件读取、资源加载等。
- 实现:通过接口或代理返回代理对象,延迟实际执行。
通过以上优化,文章结构更加清晰,内容更加易于阅读,同时保留了技术细节的准确性。
转载地址:http://cxco.baihongyu.com/