- 博客(44)
- 资源 (3)
- 收藏
- 关注
原创 mybatis是如何解析mapper的xml文件的
启动时会进行sessionFactory的构建, 开始解析所有mybatis的xml文件解析xml文件, 提前所有的sql对文件中的所有xml的node进行解析解析后分位两类sqlSource, 分别是DynamicSqlSource (判断sql中存在xml的node节点),如果是text节点,则解析为rawSqlSource, rawSqlSource包含staticSqlSource;以下就是静态sql,对于占位符最终后将 #{id, jdbcType=BIGINT} 解析为?
2025-03-04 19:13:14
758
原创 flink代码执行流程
我们知道flink的环境信息是在flink代码提交时创建的, 当flink反射到我们的main方法执行时, 我们自己的业务逻辑是如何执行的呢?如何和flink框架进行交互的?我们知道我们的业务逻辑主要用到的环境方法有两个另外一个就是excute。
2025-02-18 10:40:24
146
原创 lamda表达式是什么
当代码执行到lamda, lamda就会被new, lamda是引其所在的类为外部类, 自己为内部类,创建的对象, 持有外部类的对象 作为自身的参数 arg$1, 以及其他在调用时传入自己参数arg$2, arg$3 等等,
2025-02-14 16:32:41
188
原创 springBoot之环境变量
springboot 在new SpringBootApplication()时, 会扫描所有的spring.factory;它会给每个接口当做group,所有实现类为List当做value,形成map;
2025-02-14 00:54:54
126
原创 深入理解动态代理
对于代码的增强逻辑我们是清楚具体实现的,一种方式是增强逻辑作为委托类,被其他业务类调用,这样会有很多重复代码,而且,当需要根据动态参数来决定增强逻辑时,重复代码会更多,逻辑会更不清晰二,也是动态代理产生的原始需求,解决类爆照问题, 所以jvm自动加载动态生成的class字节码,形成动态代理对象三 动态代理核心要解决就去取增强其他业务代码, 业务代码是泛化的,不确定的,
2025-02-10 19:20:33
504
原创 flink是如何发现我们自己jar的main方法开始执行的
在执行时, 会把全局配置,放入factory的lamda对象, lamda对象就是new和类定义是一起产生的(孪生的,这是lamda的最大特点) ,然后把对象设置进StreamContextEveiroment。后面用户自定义程序时,才能重StreamContextEnviroment中读取全局的flink配置信息, 调用fatory对象的createxxx方法,实现环境变量的构建,给用户的自定义程序使用。因为main方法是static,所以 反射的obj对象是null,调起用户的程序。
2025-02-08 19:19:29
225
原创 flink的streamGraph逻辑图优化为jobGraph
的上限由节点的并行度是否一致, 及下游算子节点只有一个上游等, 把每个节点的上下游节点是否可合并放入两个集合中,然后再递归遍历两个集合中的节点。streamGraph到jobGraph主要作用是优化某些节点的合并,避免任务网络开销, 将多个节点合并在一个slot内执行。然后把可chain的节点放入 以起始节点为key, value是list的map中,把他们可chain一起的算子保存在一起。如果判断下游节点是可chain的, 则不可chain得递归会被忽略,如下代码。从起点开始遍历递归, 判断。
2025-02-07 19:15:36
292
原创 flink如何形成业务代码一致的逻辑图
在构建图时,会转化每个transfer, 从最后的算子节点开始, 但是转化当前算子时, 会优先转化他的前置节点, 即从后向前遍历算子,这样实现了优先实现了第一个算子的转化;这样从后向前的订阅连,其实是通过递归的方式,算完第一个然后挨个往下遍历 和责任链很相似, 处理自己时,先往上处理自己的上游节点,然后栈在一层层退,处理到自己, 然后给边的两头绑两个顶点vetecix;把边给节点,把节点给边,形成相互绑定关系,形成图。
2025-02-07 17:52:39
165
原创 jvm工具
GCEasy,访问地址:https://gceasy.io/,是一款在线的 GC 日志分析工具,支持各种版本的 GC 日志格式。FastThread,官网地址:https://fastthread.io/,线程分析工具,后面我们专门有一节课程会进行介绍。HeapHero,官网地址:https://heaphero.io/,顾名思义,这是一款 Heap Dump 分析工具。
2024-12-06 16:32:18
236
原创 G1、cms 垃圾回收
G1 的remeberSet 增加可达性的中间统计,避免从gc root开始扫描造成全量扫描及耗时较长,实现部分区域回收, 达到回收时间短的目的。CMS 脏卡最终标记处理,处理老年代。
2024-12-06 11:19:56
149
原创 分布式锁比较
前言在某些场景中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的。随着技术快速发展,数据规模增大,分布式系统越来越普及,一个应用往往会部署在多台机器上(多节点),在有些场景中,为了保证数据不重复,要求在同一时刻,同一任务只在一个节点上运行,即保证某一方法同一时刻只能被一个线程执行。在单机环境中,应用是在同一进程下的,只需要保证单进程多线程环境中的线程安全性,通过 JAVA 提供的 volatile、ReentrantLock、synchronized 以及 concurrent 并发
2022-04-07 14:29:21
180
原创 mybatis一级缓存失效
先整合mybatis和spring因为线程安全,sqlSessionTemplate 是单例的; defaultSqlSession 是线程不安全的;所以每个线程用于一个defaultSqlSession是安全的,及sqlSesstionTemplate拥有多个DefaultSqlSession ; 每个defaultSqlSession执行自己的查询;pom.xml <dependency> <groupId>org.springframewor
2022-04-06 15:12:40
298
原创 G1和CMS
CMS: concurrent Mark Sweep以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现有人会好奇为什么标记清理算法会产生内存碎片!但是CMS仍采用这种算法呢?答案是:因为CMS作为第一款实现用户线程和收集线程并发执行的收集器!当时的设计理念是减少停顿时间,最好是能并发执行!但是问题来了,如要用户线程也在执行,那么就不能轻易的改变堆中对象的内存地址!不然会导致用户线程无法定位引用对象,从而无法正常运行!而标记整理算法和复制算法都会移动存活的对象,这就与上面的策略不符!因此CM
2021-05-08 18:18:42
205
原创 Redis集群
Redis集群方案Redis集群方案基于分而治之的思想。Redis中数据都是以Key-Value形式存储的,而不同Key的数据之间是相互独立的。因此可以将Key按照某种规则划分成多个分区,将不同分区的数据存放在不同的节点上。这个方案类似数据结构中哈希表的结构。在Redis集群的实现中,使用哈希算法(公式是CRC16(Key) mod 16383)将Key映射到0~16383范围的整数。这样每个整数对应存储了若干个Key-Value数据,这样一个整数对应的抽象存储称为一个槽(slot)。每个Redis Cl
2021-05-07 18:52:02
168
原创 分布式事务
什么是分布式事务为什么会有分布式事务?分布式理论CAP定理BASE理论分布式事务解决方案两阶段提交(2PC)三阶段提交(3PC)补偿事务(TCC)本地消息表消息事务最大努力通知Sagas 事务模型总结...
2021-05-07 18:31:40
113
原创 七层负载均衡&四层负载均衡
内容安排简介区别Nginx、LVS及HAProxy负载均衡软件的优缺点一、简介** 所谓四层就是基于IP+端口的负载均衡;七层就是基于URL等应用层信息的负载均衡;**同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡。 换句换说,二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址;三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址;四层通过虚拟IP+端口接收请求,然后再分配到真实的服务器;七层通过虚拟的URL或主机名接收请求,然后再
2021-05-06 17:36:27
384
原创 限流
限流简介现在说到高可用系统,都会说到高可用的保护手段:缓存、降级和限流,本博文就主要说说限流。限流是流量限速(Rate Limit)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服务、排队或等待、降级等处理。对于server服务而言,限流为了保证一部分的请求流量可以得到正常的响应,总好过全部的请求都不能得到响应,甚至导致系统雪崩。限流与熔断经常被人弄混,博主认为它们最大的区别在于限流主要在server实现,而熔断主要在client实现,当然了,一个服务既可以充当server也可以充当client
2021-05-06 17:00:46
285
原创 网路结构
内核和应用程序交互应用程序是建立在linux基础上得,传输层tcp/udp; 端口是由内核分配给应用程序,应用程序通过端口,以来内核网路服务(队列,socket)对外通信;三次握手目的是双方都要给对象进行ack (确认) 才可以保证稳定得通信四次分手分层设计网络抓包 观察单次连接得详细内容tcpdump -nn(数字得形式展示ip) -i eth0 (对应得网卡) port 80 监听对应端口得数据socket的申请和使用业务处理和网络连接事件职责单一观察机器整体连接情况
2021-05-06 00:21:53
116
原创 jdk动态代理
一、什么是代理?二、Java 动态代理类三、JDK的动态代理怎么使用?四、动态代理怎么实现的?五、结论一、什么是代理?代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。代理模式UML图:简单结构示意图:为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护
2021-02-22 22:40:44
116
原创 reactor的执行顺序
import io.reactivex.Observable;import org.junit.Test; /** * @description: 测试onNext、onComplete、doOnNext、doFinally、doAfterTerminate执行顺序 * @author: lizz * @date: 2020/11/17 17:56 */public class ExeOrder { @Test public void orderTester() {
2021-01-07 18:35:16
484
原创 Future整理
本文结构1.Runnable的短板总的来说”三无产品“无入参无返回值;主调线程无法获取子线程的结果无异常2. Callable@FunctionalInterfacepublic interface Callable<V> { V call() throws Exception;}3. Callable与Runnable的对比callable “三有产品”runnable z...
2020-10-18 00:40:08
116
原创 代码扩展性设计---钩子
在编排好业务逻辑中,因为某些部分业务是变动的,但这部分的变动属于主流程,将变动的部分设计成钩子(即方法的入参是一个接口对象),在真实执行时,钩进来变动的代码进行执行;
2020-10-15 21:47:45
185
原创 springboot原理知识清单
一、抛砖引玉:探索Spring IoC容器二、夯实基础:JavaConfig与常见Annotation三、削铁如泥:SpringFactoriesLoader详解四、另一件武器:Spring容器的事件监听机制五、出神入化:揭秘自动配置原理六、启动引导:Spring Boot应用启动的秘密在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而Spring Boot应用本质上就是一个基于Spring框
2020-10-11 22:56:08
329
原创 stack分析工具
https://fastthread.io/ft-thread-report.jsp?dumpId=1&oTxnId_value=d4990599-c893-4037-b5fb-d6823ec81b0e#exceptionMenu
2020-09-30 10:57:05
422
原创 如何拒绝需求
程序员是个好职业,工资高、又体面,唯一的缺点就是费头发。在日常工作当中,产品经理是跟程序员打交道最多的人,据说产品经理的靠谱程度,跟程序员掉头发的速度成反比,也就是说产品经理越不靠谱,程序员越容易早谢。程序员最头痛的事情,莫过于碰到不靠谱的产品经理,吵又吵不赢他们,动手吧,又不是我们这些受过9年义务教育的人应该干的事。那怎么办呢?为了解决这个难题,老K走访了10多位互联网大厂的骨灰级程序员,他们常年跟产品经理打交道,还能活到现在,必定有过人之处,吃过的盐比我们走过的桥还多。关上灯,他们就是房间里最亮的星
2020-09-27 09:39:04
1077
原创 sentinel的原理
LeapArray分析我们知道StatisticSlot是Sentinel的核心插槽之一,用于统计实时的数据,后续大部分限流降级的规则都是基于StatisticSlot统计的数据来进行检查。因此对于它是如何统计的,需要了解下。Sentinel 底层采用高性能的滑动窗口数据结构 LeapArray 来统计实时的秒级指标数据它有4个关键的属性。windowLengthInMs 每个窗口有多少毫秒sampleCount 窗口数量intervalInMs 要统计的间隔时长array 即统计
2020-09-11 23:24:09
521
原创 修改线程核心数
https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
2020-08-21 22:47:01
455
原创 linux的tr命令
tr 命令的功能tr命名是简化了的sed命令。其主要的功能包括:a. 用一个字符来替换另外一个字符。b. 删除字符串中的指定子串。c. 合并字符串中重复串。常见的命令格式:tr -c -d -s [“string1_to_translate_from”] [“string2_to_translate_to”] < input-file-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。-d 删除字符串1中所有输入字符。-s 删除所有重复出现字符序列,只保留第一..
2020-08-18 23:03:27
309
原创 解决gitingnore不生效的问题
git rm -r --cached .git add .git commit -m ‘update .gitignore’
2020-06-08 20:55:45
614
原创 mockito
@RunWith(MockitoJUnitRunner.class)public class UserServiceImplTest { @InjectMocks UserServiceImpl userService; @Mock UserMapperImpl userMapper; @BeforeMethod public void setUp() { Mockito...
2020-05-07 19:29:13
129
原创 java不在担心空指针
1.String 判空 import org.apache.commons.lang.StringUtils; StringUtils.isNotEmpty2.集合类判空 import org.apache.commons.collections.CollectionUtils; CollectionUtils.isNotEmpty(Lists.newArrayList());3.对象链式取...
2020-05-06 17:03:24
154
原创 表查询执行顺序
SELECT 查询列表 ⑦ FROM 表 1 ①【连接类型】 JOIN 表 2 ② ON 连接条件 ③WHERE 筛选条件 ④GROUP BY 分组列表 ⑤HAVING 分组后的筛选条件 ⑥ORDER BY 排序的字段 ⑧LIMIT 起始的条目索引,条目数; ⑨...
2020-04-28 10:33:58
262
原创 Test如何写单测用例
@SpringBootTestpublic class NgTest extends AbstractTestNGSpringContextTests { @Autowire //递归依赖需要通过mock bean来解决,这样聚焦需要测试的类 我们要测试的bean}@SpringBootApplication(scanBasePackages = //mock的bean的包地址 ...
2020-04-26 21:08:33
1282
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人