自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JadeBai的技术成长之路

走在实现目标的路上。。。

  • 博客(51)
  • 收藏
  • 关注

原创 Redis学习系列-redisServer

Redis服务器(redisServer)内部结构Redis的内部结构是一个RedisServer对象,里面包含了整个redis运行的各种组件(数据库,客户端,持久化,主从,哨兵,集群),我们先看一下源码:struct redisServer { /* General */ pid_t pid; /* Main process pid. */...

2020-04-26 14:13:33 662

原创 Redis学习系列-开篇

Redis是什么?Redis是一个开源的使用ANSI c语言编写的远程的基于内存的高性能的key-value存储系统(区别于MySQL的二维表格的形式存储)。Redis特点/优势性能高 :基于内存读写,读的速度是110000次/s,写的速度是81000次/s ;多种数据类型 :string(字符串),list(列表),hash(哈希),set(集合),zset(有序集合);原子性 :所...

2020-04-26 11:30:49 214

原创 ThreadLocal

ThreadLocal:看到这个单词,大家应该就猜到了,跟线程有关系。在讲之前我们先来看一段简单的代码:public class ThreadLocalTest { public static void main(String[] args) { final Demo demo = new ThreadLocalTest().new Demo(); ...

2019-09-05 19:41:48 184

原创 深入理解Spring之扩展接口

Spring 的设计中留给了我们大量的扩展接口供开发者去自定义自己的功能,其中AOP 就是在 Spring 预留的扩展接口中实现的,所以说只要遵守 Spring 对扩展接口的约定,那么就能实现自己想要的功能。那么我们具体来看一下都有哪些扩展接口。1.FactoryBean(Aop就是通过这个接口来实现的),我们看一下这个接口里面的方法:public interface FactoryBe...

2019-09-03 20:19:05 497

原创 Mybatis学习系列(十三):Mybatis整合spring

Mybatis整合spring主要是通过mybatis-spring这个jar包来处理的,主要有两个重要的过程: 1.SqlSessionFactory,SqlSession的初始化 2.mapper的解析和生成代理对象1.SqlSessionFactory,SqlSession的初始化,首先我们看一下项目中的使用配置//这里通过SqlSessio...

2019-08-28 19:57:03 228

原创 Mybatis学习系列(十二):PageHelper分页插件

由于mybatis原生的分页是在内存里面进行的,导致效率很低,但是我们在生产项目中有很多的分页需求,这个时候PageHelper分页插件就诞生了。PageHelper主要是通过插件拦截链实现的。我们知道在创建StatementHandler 的时候,我们包装了interceptorChain链public StatementHandler newStatementHandler(Exec...

2019-08-27 20:58:26 703

原创 Mybatis学习系列(十一):RowBounds内存分页

Mybatis默认的分页是通过RowBounds参数来实现的,并且是在内存里面进行的,我们看一下整体的流程在获取MapperMethod的时候我们发现,通过方法的入参是否有RowBounds参数来判断是否分页this.rowBoundsIndex = getUniqueParamIndex(method, RowBounds.class);private Integer getUn...

2019-08-27 19:13:17 2940

原创 Mybatis学习系列(十):缓存

mybatis的缓存主要是分为两种:一级缓存和二级缓存:一级缓存:一直开启,不能关闭,默认是session级别的,但是可以设置成statement级别。session级别:表现为---MyBatis执行SQL语句之后,这条语句就是被缓存,以后再执行这条语句的时候,会直接从缓存中拿结果,而不是再次执行SQL。但是在两个相同的查询之间,如果当前数据被修改,会进行两次查询。作用域是SqlSe...

2019-08-26 21:24:26 207

原创 Mybatis学习系列(九):select的执行

我们先看一下MapperMethod中有哪些select查询,都是如何实现的case SELECT: //1.返回void if (method.returnsVoid() && method.hasResultHandler()) { executeWithResultHandler(sqlSession, args);...

2019-08-26 20:38:29 1137

原创 Mybatis学习系列(八):Insert,update,delete的执行

由于MapperMethod中Insert,update,delete这三个的执行方式是一样的,我们统一看一下case INSERT: { Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.insert(command.getNa...

2019-08-26 19:35:28 860

原创 Mybatis学习系列(七):Mapper执行

第六篇文章我们拿到了Mapper的一个代理对象,我们知道代理对象的执行其实是交给了InvocationHandler来处理的,也就是我们的MapperProxy对象。我们看一下invoke方法:public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { ...

2019-08-24 22:17:46 824

原创 Mybatis学习系列(六):获取对应的Mapper

第五篇文章中,我们获取到了SqlSession对象,然后我们在执行的时候是通过获取Mapper,然后通过执行mapper的方法来获取我们需要的数据,这篇我们就看一下这个通过SqlSession获取Mapper的过程。 DefaultSqlSession public <T> T getMapper(Class<T> type) { //这里调用的是con...

2019-08-24 16:43:31 1493

原创 Mybatis学习系列(五):SqlSession

前面我们讲完了SqlSessionFactory的初始化,这里我们主要看一下如何通过SqlSessionFactory获取SqlSession对象的,在获取SqlSession的同时,又做了哪些操作在前面我们了解到最终获取的SqlSessionFactory其实是DefaultSqlSessionFactory对象,我们看一下这个对象的方法:这里可以看到,重载了获取session的方法,一...

2019-08-24 15:36:33 200 1

原创 Mybatis学习系列(四):源码解析—解析mapper

上一篇主要是介绍了mybatis-config.xml配置文件的解析,里面只是简单的列了一下mapper的解析,由于这个是比较核心和重要的,这里我们将进行详细的解析:private void mapperElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : par...

2019-08-23 21:34:24 171

原创 Mybatis学习系列(三):源码解析—解析mybatis-config.xml

在初始化配置的过程中我们看到这样一段代码:解析mybatis-config.xml里面的配置信息,初始化configurationif (this.configLocation != null) { //根据配置文件生成XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder(this.configLocatio...

2019-08-22 19:56:41 237

原创 Mybatis学习系列(二):源码解析—SqlsessionFactory

在使用mybatis的第一步其实就是加载配置信息,生成SqlSessionFactory初始化Configuration对象。final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); se...

2019-08-21 21:27:55 463

原创 Mybatis学习系列(一):开篇介绍

MyBatis 是Apache的一个Java开源项目,是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis可以将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中。特点:1.Mybatis通过参数映射方式,可以将参数灵活的配置在SQL语句中的配置文件中,避免在Java类中配置参数(JDBC)2.Mybatis通过输出映射机制...

2019-08-21 20:32:40 182

原创 ShardingJdbc2.X学习总结系列(十三):源码解析—SQL解析之Insert语句的values解析

这一篇我们主要具体看一下Insert语句的values解析public void parse(final InsertStatement insertStatement) { Collection<Keyword> valueKeywords = new LinkedList<>(); valueKeywords.add(Default...

2019-08-20 19:31:59 477

原创 ShardingJdbc2.X学习总结系列(十二):源码解析—SQL解析之表名解析

这篇文章我们会详细看一下SQL里面表名解析的详细过程。不管是增删改查最终表结构的解析都是走TableReferencesClauseParser这个解析类,我们看一下这个类的结构图我们看一下这个parse方法的整体调用流程public final void parse(final SQLStatement sqlStatement, final boolean isSingleT...

2019-08-18 18:49:12 1196

原创 Dubbo学习之路(十三):RpcContext隐式传参

RpcContext:试一次请求的零时的上下文记录器,内部的实现是一个 ThreadLocal

2019-08-13 21:09:54 6971 3

原创 Dubbo学习之路(十二):Filter—ExceptionFilter(异常处理)

在项目开发中呢,我们经常会遇到一些异常,有时候我们会感觉有点懵,不明白设定的自定义异常我们捕获不道,抛出了我们不想要的异常信息,这一张我们就具体来看一下Dubbo的ExceptionFilter(异常处理)的实现。

2019-08-13 10:17:55 957

原创 Dubbo学习之路(十一):Filter(过滤器)

Filter(过滤器):就是在真正的请求前后做一些相应的通用的处理,比如权限的验证,日志的打印等。在很多的框架中都有这个,比如Spring,Mybatis,Dubbo等框架都有使用这个。今天主要是看一下在Dubbo中Filter的使用和扩展。...

2019-08-12 18:10:54 1829

原创 Dubbo学习之路(十):集群容错-LoadBalance

当我们通过路由规则处理以后还是获取到了多个Invoker,但是每次发次调用必然只是调用某一个有效的Invoker,那这个负载均衡的功能就是LoadBalance去实现的,我们依然先来看一下这个几口的实现类和方法。Invoker<T> invoker = loadbalance.select(invokers, getUrl(), invocation)public &l...

2019-08-11 17:40:45 190

原创 Dubbo学习之路(九):集群容错-Cluster

前面我们已经走到了,获取到了所有有效的可调用的Invoker,那么正式的调用是什么情况呢?我们知道在服务发现的时候最后一步获取的Invoker的时候其实是调用了cluster.join方法,这个方法主要是把多个Invoker封装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,我们先看一下Cluster的继承关系图这里一共有9种,而每个方法里面都返回了各自的Invoker,而调...

2019-08-10 18:27:08 229

原创 Dubbo学习之路(八):集群容错-Router

Router的功能了,根据路由规则,获取到有效的(可访问的Invoker)。

2019-08-09 20:26:40 407

原创 Dubbo学习之路(七):集群容错-Directory

上一篇文章说到服务调用流程,其中有几个很重要的名词,今天就主要说一下Directory我们知道,主要是利用这个类,去获取到当前注册的所有的Invoker,我们先看一下这个接口的实现类和方法这里一共有两个实现类:StaticDirectory(静态),RegistryDirectory(注册中心)StaticDirectory(静态),这个我们使用的少,基本不使用,这里面的Invok...

2019-08-09 18:30:54 726

原创 ShardingJdbc2.X学习总结系列(十):源码解析—读写分离(主从)

前面9篇文章主要是介绍了,shardingJdbc的介绍,使用,包括分库分表的源码解读,我们知道shardingJdbc不仅仅只有做分库分表的功能,还可以读写分离,并且可以支持分库分表+读写分离联合使用,这篇的话我们就来了解一下简单的读写分离是怎么实现的。shardingJdbc读写分离支持1、提供了一主多从的读写分离配置,可独立使用,也可配合分库分表使用。2、同一线...

2019-08-08 21:22:26 421

原创 ShardingJdbc2.X学习总结系列(十一):源码解析—事务

事务:恢复和并发控制的基本单位。具有ACID(原子性、一致性、隔离性、持久性)四大属性。数据库事务:可以是一条sql或者一组sql的执行,当事务包含多条sql时,有一个执行出现异常,就会全部回滚。但是ShardingJdbc是主要应用在分库分表上,当这个时候在加上事务的话,就会使事务变得很复杂。ShardingJdbc默认是没有事务的,如果配置了事务也是弱事务,我们看一下官方文档对于弱...

2019-08-08 21:22:17 380

原创 ShardingJdbc2.X学习总结系列(九):源码解析—SQL执行结果合并

从前面几篇文章,我们了解了从SQ解析---》SQL路由--》SQL改写--》SQL执行的整体过程。这一篇主要是讲解执行的结果如何变成正规结果相应到调用方的。这里不同的执行方法处理的方式(execute , executeUpdate , executeQuery )也是不一样的1.execute 方法返回的是boolean 类型,处理比较简单public boolean exec...

2019-08-05 11:41:26 228

原创 ShardingJdbc2.X学习总结系列(八):源码解析—SQL执行

前面几篇文章介绍了SQL解析,SQL路由,SQL改写的过程,包括组装成最后的Collection<PreparedStatementUnit>这篇文章就开始介绍SQL的执行了public boolean execute() throws SQLException { try { ① Collection<PreparedState...

2019-08-04 19:40:09 195

原创 ShardingJdbc2.X学习总结系列(七):源码解析—SQL执行前准备

在通过解析,路由,改写之后还需要做一步处理,把 生成的SQLRouteResult的对象转换成 Collection<PreparedStatementUnit>private Collection<PreparedStatementUnit> route() throws SQLException { Collection<PreparedSt...

2019-08-04 18:08:29 147

原创 ShardingJdbc2.X学习总结系列(六):源码解析—SQL改写

前两篇我们介绍了SQL解析和SQL路由两个功能,这篇文章我们主要是介绍SQL改写。1.首先还是介绍一些关键词语1.SQL 改写:改写 SQL,解决分库分表后,查询结果需要聚合,需要对 SQL 进行调整,例如分页SQLToken,SQL标记对象接口。SQLRewriteEngine 基于 SQLToken 实现 SQL改写。SQL解析器在 SQL解析过程中,很重要的一个目的是标记需要SQ...

2019-08-04 16:30:03 230

原创 ShardingJdbc2.X学习总结系列(五):源码解析—SQL路由

上篇主要介绍了SQL解析的过程,这一篇主要讲解的是SQL路由首先介绍几个重要的名词+内部实现图1.TableRule:表规则配置对象 1.1DataNode :静态分库分表数据单元 数据分片的最小单元,由数据源名称和数据表组成。 例:ds_1.t_order_0。配置时默认各个分片数据库的表结构均相同, ...

2019-08-03 17:35:27 1240 1

原创 log日志系列总结

1.背景 在现在这个服务化横行的时代,我们会对接很多的服务方,但是每个服务方的开发人员都会有一个自己用的习惯的日志实现,其中包括(Logback、Log4j1、Log4j2、JCL、J.U.L),在我们开发过程中就需要整合所有对接的业务方的日志输出。2.遇到的问题 由于引入不同服务方,导致自己项目中日志的冲突,在各种日志JAR的冲突中总是尝试的去排除一些J...

2019-07-08 19:00:41 465

原创 ShardingJdbc2.X学习总结系列(四):源码解析—SQL解析

1.解析包整体介绍1.5.0M1版本以后采用的是自研的解析引擎,支持join、aggregation、order by、group by、limit、or;目前不支持union、部分子查询、函数内分片等不太应在分片场景中出现的SQL解析。ORM采用的是mybatis 我们可以知道mybatis执行的流程 获取prepareStatement pri...

2019-01-31 16:56:23 559

原创 ShardingJdbc2.X学习总结系列(三):源码解析—整体流程

整体介绍条件:数据库为mysql ORM为mybatismybatis执行顺序为 :1.获取DefaultSqlSession2.生成Executor3.获取StatementHandler4.调用StatementHandler,通过connection获取Statement5.根据SQL请求执行Statement相应的方法6.调用ResultSetHandl...

2019-01-31 16:30:46 340

原创 ShardingJdbc2.X学习总结系列(二):使用

1.maven 引入依赖jar包<dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>2.0.3</version></de...

2019-01-31 16:19:55 594

原创 ShardingJdbc2.X学习总结系列(一):介绍

1.简介Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据库分库分表访问。 它直接封装JDBC协议,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零。 它定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无...

2019-01-31 16:06:20 1504

原创 线程池原理+JDK1.8源码解析

线程池创建的方式:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,...

2019-01-31 15:51:44 350

原创 Java类加载的顺序-包含父子关系

                                                                         Java类加载的顺序-包含父子关系首先看一段代码:public class TestClassLoader { static class Father { public static final String TAG =...

2019-01-04 18:25:00 742 2

空空如也

空空如也

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

TA关注的人

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