自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 行锁

MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁。比如 MyISAM 引擎就不支持行锁。InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。两阶段锁在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁的申请时机尽量往后放。死锁和死锁检测当并发系统中不同线程出现循环资源依赖,涉及的线程都在

2020-12-29 19:47:30 412

原创 全局锁和表锁

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、

2020-12-29 19:46:40 169

原创 SQL更新流程

前面提到一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,这是怎样做到的呢?我们是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c:mysql> create table test(id int primary key, c int);如果要将id=2这一行的值加1,SQL就会这么写

2020-12-20 10:42:13 407 1

原创 SQL查询流程

查询过程我们平时使用数据库,通常会把它看成一个整体。比如有一个表test,其中有一个字段是id,执行下面这个SQL语句时:select * from test where id = 1;我们只是关注输入一条语句,返回了一个结果,却不知道这条语句在MySQL内部执行的过程。我们现在把MySQL拆解一下,看看里面有哪几部分,这几部分的功能是什么样的。这样我们碰到MySQL的一些异常或者问题时,能够从本质出发,快速定位问题。下面给出MySQL基本架构示意图:大体来说,MySQL分为Server层和

2020-12-20 10:40:23 670 1

原创 “order by”是怎么工作的?

在平常的开发过程中,一定遇到过根据某字段进行排序的需求。以市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。假设这个表的部分定义是这样的:CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAU

2020-12-01 23:31:45 104

原创 MySQL之初识索引(下)

在上一篇文章中,介绍了InnoDB索引的数据结构模型,现在聊聊跟MySQL索引有关的概念。在下面这个表 T 中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?下面是这个表的初始化语句。mysql> create table T (ID int primary key,k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '',index k(k

2020-12-01 20:44:03 69

原创 MySQL之初识索引(上)

索引的常见模型一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即key,就可以找到其对应的值即Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把value放在数组

2020-12-01 19:55:43 136

原创 mybatis之StatementHandler

StatementHandler接口是MyBatis核心接口之一,它完成了MyBatis最核心的工作。StatementHandler接口中的功能很多,例如创建Statement对象,为SQL语句绑定实参,执行select、insert、update、delete等多种类型的SQL语句,批量执行SQL语句,将结果集映射成结果对象。StatementHandler接口的定义如下:public interface StatementHandler { // 从连接中获取一个Statement S

2020-06-14 21:05:46 976

原创 mybatis之SqlSession

.SqlSessionDefaultSqlSession核心字段的含义如下: // 配置对象 private final Configuration configuration; // 底层依赖的Executor对象 private final Executor executor; // 是否自动提交事务 private final boolean autoCommit; // 当前缓存是否有脏数据 private boolean dirty; // 为防止用户忘记关闭

2020-06-14 21:05:01 3066

原创 mybatis之Executor

Executor是MyBatis的核心接口之一,其中定义了数据库操作的基本方法。在实际应用中经常涉及的SqlSession接口的功能,都是基于Executor接口实现的。Executor接口中定义的方法如下:public interface Executor { ResultHandler NO_RESULT_HANDLER = null; // 执行insert、update、delete等操作 int update(MappedStatement ms, Object paramete

2020-06-14 21:03:56 365

原创 mybatis之SQLNode&SqlSource

SqlNode&SqlSource1.DynamicContextDynamicContext主要用于记录解析动态SQL语句之后产生的SQL语句片段,可以认为它是一个用于记录动态SQL语句解析结果的容器。DynamicContext中核心字段 含义如下: // 参数上下文 private final ContextMap bindings; // 在SqlNode解析动态SQL时,会将解析后的SQL片段添加到该属性中保存,最终拼凑出一条完成的SQL语句 private final

2020-05-18 00:57:39 634

原创 MyBatis初始化(二)之XMLConfigBuilder

XMLConfigBuilderXMLConfigBuilder是BaseBuilder的众多子类之一,它扮演的是具体建造者的角色。XMLConfigBuilder 要负责解析mybatis-config.xml 配置文件,其核心字段如下: // 标识过是否解析过mybatis-config.xml配置文件 private boolean parsed; // 用于解析mybat...

2020-04-19 19:09:16 874

原创 MyBatis初始化(一)之BaseBuilder

BaseBuilderMyBatis的初始化的主要工作是加载并解析mybatis-config.xml配置文件、映射文件以及相关的注解信息。Mybatis的初始化入口是SqlSessionFactoryBuilder.build()方法,其具体实现是:public SqlSessionFactory build(InputStream inputStream, String environme...

2020-04-19 19:07:58 829

原创 设计模式之建造者模式

建造者模式定义:使用多个简单的对象一步一步构建成一个复杂的对象。建造者模式的优缺点优点各个具体的建造者相互独立,有利于系统的扩展。客户端不必知道产品内部组成的细节,便于控制细节风险。缺点产品的组成部分必须相同,这限制了其使用范围。如果产品的内部变化复杂,该模式会增加很多的建造者类。建造者模式的应用场景需要生成的对象具有复杂的内部结构.需要生成的对象内部属性本身...

2020-04-13 00:49:10 121

原创 Mybatis Plugin插件设计应用

一、mybatis自定义拦截器实现步骤实现**org.apache.ibatis.plugin.Interceptor**接口添加Intercepts注解。在XML配置文件或配置对象中添加拦截器。二、利用自定义拦截器实现数据库备份创建拦截器,并编写相应的逻辑@Slf4j//添加Intercepts注解。@Intercepts({ @Signature(type = Execut...

2020-04-07 00:39:20 209

原创 Mybatis Plugin插件设计原理

一、背景在很多业务场景下我们需要去拦截sql,达到不入侵原有代码业务处理一些东西,比如:历史记录、分页操作,数据权限过滤操作,SQL执行时间性能监控等等,这里我们就可以用到Mybatis的插件Plugin。二、Mybatis核心对象介绍从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个:Configuration:初始化基础配置,比如MyBatis的别名等,一些...

2020-04-03 10:20:58 166

原创 设计模式之责任链模式

责任链模式定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。责任链模式的优缺点优点:低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。增强了系统的可扩展性。可以根据需要增加新的请求...

2020-03-24 16:39:15 102

原创 zookeeper之ZAB协议

ZAB

2020-03-09 00:16:42 73

原创 squirrel-spring-boot-starter

一、Spring Boot Starter简介Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。SpringBoot提供的starter以spring-boot-...

2020-02-17 10:59:20 683

原创 Spring之自动代理生成器

一、介绍Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 。 具体是使用 BeanPostProcessor 来实现这项功能。二、BeanPostProcessorBeanPostProcessor有三种实现类分别是:BeanNameAutoProxyCreator、DefaultAdvisorAutoProxyCreator、Annotatio...

2020-01-12 23:23:41 450

原创 Java正则表达式

一、介绍正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。二、正则表达式的规则任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,-匹配-。[]代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c。-在中括号...

2020-01-05 23:42:20 289

原创 Java动态编程之javassit

什么是动态编程动态编程是相对于静态编程而言的,平时我们讨论比较多的就是静态编程语言,例如Java,与动态编程语言,例如JavaScript。那二者有什么明显的区别呢?简单的说就是在静态编程中,类型检查是在编译时完成的,而动态编程中类型检查是在运行时完成的。所谓动态编程就是绕过编译过程在运行时进行操作的技术,在Java中有如下几种方式:反射这个搞Java的应该比较熟悉,原理也就是通过在运行时获...

2019-12-30 01:08:30 219

原创 Spring源码分析之Bean加载(二)

上一篇博客主要介绍了bean加载的主要流程,本篇博客主要精讲各个步骤的详细实现一、转换对应的beanName

2019-12-22 23:27:29 79

原创 Spring源码分析之Bean加载(一)

本篇文章主要介绍bean加载的过程,详细过程请关注本系列博客。本系列博客的Spring版本为4.3.25对于bean的加载功能,在Spring中的调用方式为bf.getBean("beanName");Spring中的源码为,实际调用了doGet()方法@Override public Object getBean(String name) throws BeansException ...

2019-12-22 23:27:14 90

原创 Spring源码分析(一)

xml

2019-12-15 23:08:46 106

原创 设计模式之抽象工厂模式

抽象工厂模式定义:抽象工厂模式隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。抽象工厂模式的优缺点优点:可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新...

2019-12-02 09:57:57 116

原创 设计模式之工厂方法模式

工厂方法模式定义:工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。这种类型的设计模式属于创建型模式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂方法模式的优缺点优点用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程在...

2019-11-22 19:48:15 71

原创 设计模式之原型模式

原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需...

2019-11-16 19:25:46 76

原创 设计模式之单例模式

单例

2019-11-10 19:43:33 91

原创 lambda表达式与函数式编程

lambda表达式背景Java是一门面向对象编程语言。面向对象编程语言和函数式编程语言中的基本元素(Basic Values)都可以动态封装程序行为:面向对象编程语言使用带有方法的对象封装行为,函数式编程语言使用函数封装行为。但这个相同点并不明显,因为Java的对象往往比较“重量级”:实例化一个类型往往会涉及不同的类,并需要初始化类里的字段和方法。过有些Java对象只是对单个函数的封装。例如...

2019-11-04 01:02:13 614

原创 Stream解析

lambda

2019-10-27 16:22:10 569

原创 squirrel-foundation-demo

squirrel-foundation-demo

2019-10-21 00:08:15 2664 1

原创 Squirrel State Machine

squirrel-foundationMaven快速开始基础概念Maven当前最新发行版本<dependency> <groupId>org.squirrelframework</groupId> <artifactId>squirrel-foundation</artifactId> <version>0...

2019-10-18 16:07:28 2002

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除