1. 映射⽂件解析解析入口
映射文件的解析过程是配置文件解析过程的一部分,MyBatis 会在解析配置文件的过程中对映射文件进行解析。解析逻辑封装在 mapperElement 方法中
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849// -☆- XMLConfigBuilderprivate void mapperElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : parent.getChildren()) { if ("package".equals(child.getName())) { // 获取 <package> 节点中的 name 属性 String mapperPackage = ch ...
1. 配置⽂件解析过程分析
在使用 MyBatis 时,第一步要做的事情一般是根据配置文件构建 SqlSessionFactory对象。
1234String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
们首先会使用 MyBatis 提供的工具类 Resources加载配置文件,得到一个输入流。然后再通过 SqlSessionFactoryBuilder 对象的 build 方法构建 SqlSessionFactory对象。这里的 build 方法是我们分析配置文件解析过程的入口方法。
12345678910111213141516171819202122232425262728// -☆- SqlSessionFactoryBuilderpublic S ...
1. JAVA内存模型
Java内存模型的基础
并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:
线程之间如何通信
线程之间如何同步
(这里的线程是指并发执行的活动实体)
通信是指线程之间以何种机制来交换信息
同步是指程序中用于控制不同线程间操作发生相对顺序的机制
在命令式编程中,线程之间的通信机制有两种:
共享内存
线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信
同步是显式进行的,��序员必须显式指定某个方法或某段代码需要在线程之间互斥执行
消息传递
线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信
由于消息的发送必须在消息的接收之前,因此同步是隐式进行的
Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明
Java内存模型的抽象在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(ExceptionHan ...
1. 并发编程挑战
上下文切换
多线程与串行执行效率比对
多线程一定快吗?
当并发不超过一定的数量级,速度会比串行执行慢。
原因
线程创建会有上下文切换开销
测试上下文切换次数和时长
Lmbench3 :测量上下文切换的时长
vmstat :测量上下文切换的次数
如何减少上下文切换次数
无锁并发编程
如:数据ID根据Hash算法取模分段,不同线程处理不同数据
CAS算法
Atomic包
使用最少线程
避免不需要的线程,比如任务很少,但是创建了很多线程处理。会造成大量线程处于等待
使用协程
在单线程里实现多线程的调度,并在单线程里维持多个任务间的切换
死锁避免死锁的几个常见方法
避免一个线程同时获取多个锁
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败
资源限制的挑战
硬件资源的限制有:带宽的上传/下载速度、硬盘读写速度和CPU处理速率。
软件资源的限制有:数据库连接限制 ...
1. 网络基础
根据 Web 浏览器地址栏中指定的 URL,Web 浏览器从 Web服务器端获取文件资源(resource)等信 息,从而显示出 Web 页面。
像这种通过发送请求获取服务器资源的 Web 浏览器等,都可称为客户端(client)。
Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流 程。而协议是指规则的约定。可以说,Web 是建立在 HTTP 协议上通信的。
HTTP 的诞生蒂姆 • 伯纳斯 - 李(Tim BernersLee) 博士提出了一种能让远隔两地的研究者们共享知识的设想
基本理念是:借助多文档之间相互关联形成的超文本 (HyperText),连成可相互参阅的 WWW(World Wide Web,万维网)
现在已提出了 3 项 WWW 构建技术,分别是:
SGML(Standard Generalized Markup Language,标准通用标记语言)作为页面的文本标 记语言的 HTML(HyperText Markup Language,超文本标记语言) ...
1. Redis 通信协议 RESP
简介Redis 的通信协议是 Redis Serialization Protocol,翻译为 Redis 序列化协议,简称 RESP。它具有如下特征:
在 TCP 层
是二进制安全的
基于请求 - 响应模式
简单、易懂(人都可以看懂)
RESP 所描述的是 Redis 客户端 - 服务端的交互方式,掌握了其原理我们基本上就可以撸一个简单的 Redis 客户端
RESP 描述Redis 协议将传输的结构数据分为 5 种类型,单元结束时统一加上回车换行符号 \r\n。
单行字符串,第一个字节为 +
错误消息,第一个字节为 -
整型数字,第一个字节为 :,后跟整数的字符串
多行字符串,第一个字节为 $,后跟字符串的长度
数组,第一个字节为 *,后跟跟着数组的长度1234567891011121314// 单行字符串 cherry+cherry// 错误消息-ERR unknown command 'sets'....// 整形数字 29:29// 多行字符串 chenssy$7 chenssy// 数组 [chenssy,29]*2 $7 chenssy ...
1. nginx 全局块配置
123456789101112131415161718# 使用的用户 用户组, 如果需要所有用户都可以启动Nginx,则注释掉该配置user nobody nobody;# 指定的工作进程数,一般是CPU总和数或者总和数的两倍。 可以配置为auto,自动检测worker_processes 16;# 指定错误日志的存放路径,级别有:debug/info/notice/warn/error/crit/alert/emergerror_log logs/error.log;error_log logs/error.log notice;error_log logs/error.log info;# pid的存放路径pid logs/nginx.pid;# 其他nginx配置或者第三方配置引入主配置文件中include conf.d/*.conf# 指定文件描述符数量worker_rlimit_nofile 51200;
1. 树的定义
树(tree)是包含 n(n≥0) [2] 个节点,当 n=0 时,称为空树,非空树中(n-1)条边的有穷集,在非空树中:
每个元素称为节点(node)
有一个特定的节点被称为根节点或树根(root)
除根节点之外的其余数据元素被分为m(m≥0)个互不相交的集合。
一定要注意每个节点除了和自己的双亲节点有联系,和其他节点不可相交,否则违背定义。另外树里面的上一级节点叫双亲,雌雄同体。如下所示就不是一颗树。
树中的其他概念节点的度:节点拥有的子树称为节点的度(degree)树的度:节点的度的最大值。max(节点的度);叶子节点:你可以想象树除了枝干会分叉,叶子上会长出叶子吗,所以叶子节点意思就是这个枝干的终点。终端节点。非终端节点:除根节点,非终端节点和叶子节点是非的关系,也叫做分支节点,也叫内部节点。
孩子:节点的子树的根节点就是该节点的孩子,相应的该节点就是孩子的双亲兄弟:同一个双亲的孩子互称兄弟祖先:根节点到该节点所经分支的所有节点。子孙:以某节点为根的子树中的任意节点。层次:类比人类宗族,每代人就是一层。深度或高度:树节点的最大层次就是树的高度。
树的分类树中 ...
2. 容器的初始化(二)之 Servlet WebApplicationContext 容器
概述在开始之前,我们还是回过头看一眼 web.xml 的配置。代码如下:
123456789101112131415<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> // 默 ...
2. Java代码编译过程简述
代码编译是由Javac编译器来完成,流程如下图1所示:
Javac是一种编译器,能将一种语言规范转化成另外一种语言规范,通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范,如C/C++或者汇编语言都是将源代码直接编译成目标机器码,这个目标机器代码是CPU直接执行的指令集合。这���指令集合也就是底层的一种语言规范。
Javac的编译器也是将Java这种对人非常友好的编程语言编译成对对所有机器都非常友好的一种语言。这种语言不是针对某种机器或某个平台。怎么消除不同种类,不同平台之间的差异这个任务就有JVM来完成,而Javac的任务就是将Java源代码语言转化为JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言。
Javac的任务就是将Java源代码编译成Java字节码,也就是JVM能够识别的二进制代码,从表面看是将.java文件转化为.class文件。而实际上是将Java源代码转化成一连串二进制数字,这些二进制数字是有格式的,只有JVM能够真确的识别他们到底代表什么意思。
编译器把一种语言规范转化为另一种语言规范的这个过程需 ...