自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mybatis映射集Mappers解析

在Mybatis初始化的分析中,XMLConfigBuilder#parseConfiguration()解析配置中最后通过调用mapperElement(root.evalNode(“mappers”))对映射集文件进行解析。private void mapperElement(XNode parent) throws Exception { if (parent != null) {...

2019-10-08 09:39:32 258

原创 sharding-jdbc之归并引擎

经过执行引擎的处理,返回查询的结果集需要进行归并整理,才能正确的相应客户端的调用。ShardingSphere支持的结果归并从功能上分为遍历、排序、分组、分页和聚合5种类型,它们是组合而非互斥的关系。 从结构划分,可分为流式归并、内存归并和装饰者归并。流式归并和内存归并是互斥的,装饰者归并可以在流式归并和内存归并之上做进一步的处理。由于从数据库中返回的结果集是逐条返回的,并不需要将所有的数据一...

2019-09-25 19:17:17 916

原创 sharding-jdbc之执行引擎

ShardingSphere采用一套自动化的执行引擎,负责将路由和改写完成之后的真实SQL安全且高效发送到底层数据源执行。 它不是简单地将SQL通过JDBC直接发送至数据源执行;也并非直接将执行请求放入线程池去并发执行。它更关注平衡数据源连接创建以及内存占用所产生的消耗,以及最大限度地合理利用并发等问题。 执行引擎的目标是自动化的平衡资源控制与执行效率。1 准备阶段-SQLExecutePre...

2019-09-24 16:20:44 1178

原创 Mybatis初始化

Spring#SqlSessionFactoryBean对Mybatis进行初始化包括mybatis-config.xml和mapper.xml的初始化,SqlSessionFactoryBean源码如下:public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, Initializin...

2019-09-23 18:25:32 349

原创 sharding-jdbc之改写引擎

初始SQL经历了解析和路由之后需要将SQL改写,根据分片规则指定需要对哪个库哪个表执行相应的SQL,即正确性改写:在包含分表的场景中,需要将分表配置中的逻辑表名称改写为路由之后所获取的真实表名称。仅分库则不需要表名称的改写。除此之外,还包括补列和分页信息修正等内容。改写引擎的整体结构划分如下图所示:上图中的整体结构能够清晰的看到SQL改写的类型,下面即从源码中分析各种改写的原理。public...

2019-09-23 09:17:29 462

原创 sharding-jdbc之路由引擎

根据解析上下文匹配数据库和表的分片策略,并生成路由路径。 对于携带分片键的SQL,根据分片键的不同可以划分为单片路由(分片键的操作符是等号)、多片路由(分片键的操作符是IN)和范围路由(分片键的操作符是BETWEEN)。 不携带分片键的SQL则采用广播路由。分片策略通常可以采用由数据库内置或由用户方配置。 数据库内置的方案较为简单,内置的分片策略大致可分为尾数取模、哈希、范围、标签、时间等。 由...

2019-09-20 19:13:27 981

原创 sharding-jdbc之解析引擎

sharding-jdbc对于sql的解析需要依赖解析引擎,解析过程会经历两大过程:1 通过G4规则的解析器生成抽象语法树;2 通过SQL解析引擎输出解析结果,这一步包含SQL提取、SQL填充、SQL优化。抽象语法树解析过程分为词法解析和语法解析。 词法解析器用于将SQL拆解为不可再分的原子符号,称为Token。并根据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面量和操作符。 ...

2019-09-19 09:31:32 613

原创 Sharding-jdbc之分片

sharding-jdbc的作用就不必做过多的解释了,主要用途是分库分表;首先先了解下分库分表的策略吧。1 分片键分片键即在分库分表时根据表中的某一个或者多个字段为依据,以一定的逻辑进行分割,例如根据自增的主键求模的规则进行分片等。2 分片算法分片算法结合分片键对具体的数据进行分片;支持通过=、BETWEEN和IN分片。分片算法需要应用方开发者自行实现,可实现的灵活度非常高。分片算法有四种...

2019-09-18 09:27:34 2298

原创 并发编程之并发队列

JDK 中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列,前者使用锁实现,而后者则使用CAS 非阻塞算法实现。1 非阻塞队列–ConcurrentLinkedQueueConcurrentLinkedQueue是无界非阻塞队列,内部使用单项链表实现;其中有两个volatile 类型的Node 节点分别用来存放队列的首、尾节点。从下面的无参构造函数可知,默...

2019-07-20 22:45:21 109

原创 SpringBoot--时间校验

在日常开发中常常会出现接口参数中有开始时间和结束时间两个属性,需要校验两个时间的大小关系,但JSR-303并未给出这样的注解,但是给出了ConstraintValidator这个接口,提供用户的自定义校验。下面开始开始时间和结束时间校验的注解。1 时间校验注解这个注解只能应用于类上,通过startTime和endTime方法指定被注解的类的开始时间和结束时间的属性名。@Target({Ele...

2019-07-20 22:26:21 5307 1

原创 观察者模式在Spring中的应用

观察者模式在Spring中的主要体现在事件监听,事件机制的实现需要三个部分,事件源,事件,事件监听器;1 ApplicationEvent抽象类作为事件的父类,通过source获取事件源。public abstract class ApplicationEvent extends EventObject { private static final long serialVersion...

2019-07-16 23:16:31 553

原创 代理模式在Spring中的应用

代理模式在Spring中主要体现在Spring框架的核心功能之一的AOP,通过AOP将切面通知织入到指定的切点位置,简单一点就是可以是现在某个方法运行前后添加指定的功能。下面简单实现一个将拦截器织入指定的方法上。1 拦截器接口public interface Intercepter { boolean before(); void after(); Object aro...

2019-07-15 22:52:00 1272

原创 java并发包基础 ---AQS

Java并发包中锁的底层都是使用AQS实现的,今天开始堆AQS进行简单的分析。AQS是AbstractQueuedSynchronizer的简称,继承自AbstractOwnableSynchronizer,有两个内部类Node和ConditionObject,这大致就是AQS的内部结构了。AQS 是一个FIFO 的双向队列,队列元素的类型内部类Node,Node内部类如下。static fi...

2019-07-14 22:07:54 178

原创 原子操作类LongAdder

LongAdder是一个原子性递增或者递减类,与AtomicLong的不同之处在于,LongAdder能够解决高并发情况下多线程同时竞争同意资源,而带来性能降低的问题。主要是通过将一个变量拆分为多个Cell,从而将单个变量的并发数分散到多个Cell上。关于LongAdder实现的几个分体如下:(1)LongAdder 的结构是怎样的?(2)当前线程应该出问Cell 数组里面的哪一个Cell元素...

2019-07-10 22:29:33 349

原创 Random的升级版---ThreadlocalRandom

Random在日常开发过程中还是挺常用的,用于生成随机值; Random random = new Random(); random.nextInt(100); /** *nextInt(100)实际调用的方法是next(int bits) * */ protected int next(int bits) { long oldseed, nextseed; ...

2019-07-09 22:25:22 431

原创 Java并发编程基础-----锁

1 悲观锁和乐观锁悲观锁:在sql语句末尾加上 for update乐观锁:在sql的where语句中添加version条件update tablel set name=#{name),age=#{age),version=${version)+1 where id =#{id} and version=#{version}乐观锁并不会使用数据库提供的锁机制, 一般在表中添加versio...

2019-07-09 21:27:50 213

原创 Java并发编程基础-----volatile和伪共享

synchronized是Java提供的一种原子性的内置锁,其他对象可以将其作为一个同步锁使用,synchronized能够保证内存可见性和原子性,是一个重量级的锁,而有些时候只需要保证内存可见性即可的情况下,可以使用volatile关键字,用以保证变量的内存可见性。1 volatile适用的情况写入变量值不依赖、变量的当前值时。因为如果依赖当前值,将是获取一计算一写入 三步操作,这三步操作...

2019-07-08 21:32:33 291

原创 多任务之异步调用--线程池的应用

线程池在日常开发过程中使用的频率还是很高的,在这里整理下自定义线程池的创建方式,原理方面就不赘述了。1 常规线程池的定义@Slf4jpublic class NormalTreadPool { /** * 默认最大并发数以jvm可用处理器的数量的两倍 */ private static final int DEFAULT_MAX_CONCURRENT =...

2019-07-07 10:49:14 638

原创 并发编程之ForkJoin使用及原理

以forkJoin的一个使用情景开始吧public class ForkJoinQuery extends RecursiveTask<Boolean> { private static final int THREAD_HOLD = 5000; private long start; private long end;//需要查询的所有数据的数量 private...

2019-07-05 22:15:05 360

空空如也

空空如也

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

TA关注的人

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