- 博客(210)
- 资源 (2)
- 收藏
- 关注
原创 订单正向链路压测
我们可以看到如果扣减失败只能存在第3、5步,先看第三步,第三步的设计是存在问题的,用订单号+sku作为分布式锁的key,此时可以防止同一订单中同一sku的并发问题,可是我们的需求是要做的不同订单的sku的并发问题,所以我们可以初步判断,库存数据错误可能就是分布式锁粒度的问题。----------------------------------------------修改完分布式锁key粒度后的压测分析。库存减扣⽇志不正确的问题原因: 因为commit阶段是有Seata Sever来触发的,是异步的。
2023-10-23 17:09:36 267
原创 Hive(一)
我们可以考虑使用专门负责JSON文件的JSON Serde,设计表字段时,表的字段与JSON字符串中的一级字段保持一致,对于具有嵌套结构的JSON字符串,考虑使用合适复杂数据类型保存其内容。Export导出语句可将表的数据和元数据信息一并到处的HDFS路径,Import可将Export导出的内容导入Hive,表的数据和元数据信息都会恢复。该语法允许用户利用select查询语句返回的结果,直接建表,表的结构和查询语句的结构保持一致,且保证包含select查询语句放回的内容。
2023-08-21 15:10:53 718
原创 Mybatis(十)级联映射与懒加载
该方法中先判断ResultMap是否继承了其他ResultMap对象,如果是,则将父RessultMap的构造映射信息去掉并将父ResultMap中配置的映射信息添加到子ResultMap对象中,最后通过建造者模式创建ResultMap对象。所谓的懒加载,就是我们在一个实体对象中关联了其他对象,如果不需要获取被关联的对象,则不会对被关联的实体执行额外的查询操作,仅在使用get方法获取被关联对象时才会执行该对象的查询操作。分步查询的类型才能使用懒加载,而join方式则用不了。一、Mybatis的级联映射。
2023-04-21 10:15:47 730 1
原创 Mybatis(九)插件原理及应用
Plugin类的invoke方法会在调用目标对象的方法时被调用, 在invoke方法中首先判断该方法是否被Intercepts注解指定为被拦截的方法,如果是则调用用户自定义的拦截器的intercept方法,并将目标方法等信息封装成Invocation对象作为参数。可以看出这些工厂方法都调用了InterceptorChain对象的pluginAll方法,该方法会返回对应组件的代理对象,拦截逻辑就是在代理对象中完成的,这就是为什么Mybatis自定义插件只能对这四个组件的方法进行拦截的原因。
2023-04-18 16:31:56 516
原创 Mybatis(八)动态Sql的实现原理
可以看到Sql标签解析完后,将解析后生成的SqlNode对象封装在SqlSource中,前面的学习我们知道,Mybatis的MappedStatement用于描述Mapper中的Sql配置,SqlSource创建完毕后会存放在MappedStatement对象中的SqlSource属性中,Executor组件操作数据库时会调用MappedStatement对象的getBoundSql方法获取BoundSql对象。
2023-04-17 20:10:48 1093
原创 Mybatis(七)Mybatis的日志体系
首先获取Constructor对象,然后赋值给LogFactory的logConstructor属性,所以我们调用LogFactory类的useLog4JLogging方法时,就会使用到这个实现类进行输出日志,而Log4jImpl实现类又交给Log4J框架的去输出日志,这样就达到了使用log4j去输出日志的效果。而JCL和SLF4J属于日志接口(没有日志具体实现),提供统一的日志操作规范,而日志的实际功能逻辑是由具体的日志实现框架完成的(例如log4j、log4j2、logback等)。
2023-04-12 20:32:22 888
原创 Mybatis(六)缓存
二级缓存是存在一个问题的,当对一个表的增删改查不在同一个namespace(即同一个接口中)时,会出现脏读现象,因为二级缓存是Mapper级别的(即一个Mapper接口层面),如果同一个表的修改在其他namespace(即其他Mapper)执行,此时第一个Mapper的二级缓存无法感知到第二个Mapper的二级缓存的改变,所以导致读到未刷新的数据。Mybatis的缓存类使用装饰者模式,Cache接口只有一个基本的实现类,即PrepetualCache类,该类通过一个HasshMap存放缓存对象。
2023-04-12 11:16:48 552
原创 Mybatis(五)------Mybatis执行Mapper接口的方法流程
在java中常用的动态代理一般有两种方式,jdk动态代理和cglib动态代理。上面我讲了先通过动态代理获取Mappper的代理对象,而代理方法invoke方法(代理方法调用时会调用,代理方法逻辑是通过Mapperproxy类,而代理对象的创建时通过MapperProxyFactory工厂实例化MapperProxy对象返回)中创建一个MapperMethod对象(用来描述Mappe接口中方法信息的对象),然后通过调用该对象的execute方法去执行sql语句。
2023-04-10 20:14:39 3790 1
原创 Mybatis(四)------Mybatis的核心框架
如代码所述,Mybatis通过ParameterMapping描述参数映射的信息,在DefaultParameterHandler类的setParameters方法中,首先获取Mapper配置中的参数映射,然后遍历所有参数映射信息,根据参数名称获取对应的参数值,调用TypeHandler对象的setParameter方法为Statement对象的参数占位符设置值。到这里我们就可以通过getMapper方法来创建一个动态代理对象,然后通过该代理对象调用对应的方法实现与数据库的交互。
2023-04-03 20:02:45 510
原创 Mybatis(三)--------Mybatis中常用的工具类
六、ObjectFactory(对象工厂,用来生产类或接口对应的对象)这样可以减少字符串拼接时却说空格或者偶尔编写一些不合法的字符等。七、ProxyFactory(代理工厂,用来创建动态代理·对象)四、MetaObject类(描述对象属性等信息)五、MetaObject类(描述类的相关信息)二、使用ScriptRunner执行脚本。三、使用SqlRunner操作数据库。具体源码这里不做分析。
2023-03-31 16:45:46 697
原创 Mybatis(二)
SPI机制中查找实现类的工具类是java.util.ServiceLoader,该类有一个静态load方法,用于加载指定接口的所有实现类(即驱动实现类),调用该方法后META-INF/services目录下的java.sql.Driver文件指定的驱动实现类会被加载(必须时全限定名)刚发布JDBC规范时,市场上的JDBC驱动很少,而ODBC的驱动方案几乎可以连接所有类型的数据源,所以就sun公司就发布了JDBC-ODBC的桥接驱动,将JDBC调用转为ODBC调用,不过多了一层转换,性能是比较低的。
2023-03-29 11:36:42 1236
原创 Mybatis(一)-------
RowSet可以建立一个与数据源的连接并在整个生命周期都维持其连接(称为连接的RowSet),也可以连接后获取数据就进行关闭(称为非连接RowSet)然后进行数据操作,操作完成后重新连接数据源将数据更新到数据库(中间减少了占用数据源资源,而是先断开在内存中进行数据操作后再重新连接更新数据源),相较与ResultSet,RowSet的离线操作可以利用应用内存减轻数据库的压力,由于数据操作都是在应用内存中进行的,然后批量提交到数据源,所以性能会有较大的提升。这些接口都继承java.sql.Wrapper接口。
2023-03-28 09:58:27 350
转载 spring(十二)1-----注入模型与@resource、@Autowired
spring的自动注入有两种方式:根据构造方法进行注入(注入模型为3)、set方法进行注入(注入模型为1 by name、2 by type)(当为byName时,会根据set方法名找bean,byType时根据入参类型去找bean)。手动注入:在早期得版本spring是通过xml方式配置得,我们通常往bean中注入一个属性要么提供标签通过set方法完成注入要么提供标签通过构造方法注入,这种显示得指定我们需要注入得属性叫做手动注入。
2023-03-22 16:26:02 270
原创 spring(十二)2-----Bean的自动注入及循环依赖问题
我们知道java内省机制最后都是讲解析出来的属性等转换为一个BeanInfo对象,然后所有属性等信息存在一个PropertyDescriptor数组中,而spring中在BeanDefinition中定义了一个MutablePropertyValues对象(propertyValues)中的一个List用来定义描述这个类的属性等,那么我们要往SpringBeanInfoTest中注入一个属性,此时就可以往这个List中存进我们要注入的对象即可。setXXX方法没有返回值,有一个方法参数;
2023-03-22 15:42:18 972
转载 spring(十一)---------Bean对象的实例化
bean的实例化过程主要是从BeanDefinitionMap中拿到BeanDefinition对象,通过反射获取到bean对象,而其中需要用到构造方法进行实例化,spring中存在推断构造方法的机制。
2023-03-22 00:07:27 116
原创 spring(十五)---------BeanPostProcessor之spring中各种现象的解释
----------原因和现象五一样,aop对应的BeanPostProcessor实例化优先级低于实现了BeanPostProcessor+Ordered,所以被注入的bean(进行了aop代理)就会出现在aop对应的beanPostProcessor没实例化时就执行生命周期的回调BeanPostProcessor流程,所以最好导致bean的aop失效的情况。这样第一个类卡住的时候,BeanPostProcessorService走生命周期虽然还会打印警告,但不是还可以执行第二个类的后置处理方法?
2023-03-20 15:16:38 1262
原创 spring(十四)--------AOP的原理与通知机制
2、如果代理类 没有实现接口,那么spring AOP会选择使用CGLIB来动态代理目标类,CGLIB的底层是通过ASM在运行时动态的生成目标类的一个子类,(还有其他相关的多个类,主要是为了增强调用时的效率),并且会重写父类所有的方法增强代码,调用时会先通过代理类进行增强,再直接调用父类对应的方法进行调用目标方法,从而实现AOP。这里就可以发现了,after和before是相反的,他是先递归调用proceed方法,然后由于没有其他通知了,就会调用目标方法,最后再去调用after的通知。
2023-03-15 20:47:35 697
原创 spring(十)----------Bean的生命周期
可以看到,我们之前的文章只是分析到 第一阶段(容器启动阶段),后面我们主要会对2、3、4阶段进行分析。特别注意的是,我们会对图中的6个扩展点功能场景、使用举例等方面进行解析(对于这些扩展点可以融入项目中,可以作为面试的重点进行讲解)
2023-03-13 21:57:04 75
原创 spring(九)-----如何处理配置类上的注解
该文章为了解决对于配置类上面加了多个注解例如@Import、@ImportResource、@Bean、@PropertySource、@Compnent的处理逻辑。
2023-03-06 22:50:11 318 1
原创 spring(八)————spring如何使用Cglib对@Configuration进行代理的
refresh--》finishBeanFactoryInitialization中使用代理对象回调了scan_d方法和scan_e方法,由于这两个方法加了@Bean注解,所以会被BeanMethodInterceptor.intercept();但是由于此时scan_e方法还没执行完,ThreadLocal里面还是scan_e方法,那么scan_d执行增强方法的时候去匹配ThreadLocal里面的方法就为f,此时进入resolveBeanReference方法。这篇文章我们会继续进行说明。
2023-02-28 00:52:19 923
原创 spring(六)--------spring的扫描机制
我们说到这个实现类完成对注解类的扫描。可以看到只获取includeFilters中存在的,我们知道我们自己在配置类的@CompnentScan注解中手动加入了一个Scan_C类到includeFilters,所以Scan_C是可以扫到的,那么加了@Compnent注解的Scan_A又是怎么被扫描的?-----》如是则获取配置类的部分属性,实例化一个扫描器(扫描器实例化的时候会将Compnent类加入到includeFilters中,为了后判断哪些类用了@Compnent注解)
2023-02-24 00:00:23 1930
原创 spring(五)----------invokeBeanFactoryPostProcessors方法
而ConfigurationClassPostProcessor的子接口实现方法不止扫描出注解类,还扫描出@Import+实现了ImportBeanDefifinitionRegistrar接口的类并直接进行实例化为bean(此时注解方式的类还没被实例化为Bean,只是被解析为BeanDefinition而已),所以可以说通过@Import+实现了ImportBeanDefifinitionRegistrar接口的类会比注解的类先实例化为bean。到这里我们通过debug验证了我们源码中注释的流程。
2023-02-22 00:15:11 681
原创 spring(四)——————从spring源码角度去解释前面的疑问
其子类的原理和作用?-----------------》父类中存在一个属性DefaultListableBeanFactory beanFactory;这里还要注意一点:我们是没有去手动getBean(C.class)的,并且所以BeanFactory注入的bean都是懒加载的,如果我们依赖注入成功,则会打印C类的构造方法。------------------------------invokeBeanFactoryPostProcessors方法执行前各个BeanDefinition的含义。
2023-02-17 15:16:51 629 1
原创 spring(三)-----------什么是beanDefinition?
但这两篇文章的目的是了解对象如何注入spring的,但可以看到,我们对于扫描的部分并没有分析,下面我们开始了解spring是怎么扫描到那些标注了@Compnent注解的类,然后将他们注入到spring中的。(可以先做下上面几个链接的练习,熟悉下怎么模拟达到@Compnent的效果)很多三方框架集成Spring的时候,都会通过该接口,实现扫描指定的类,然后注册到spring容器中。比如Mybatis中的Mapper接口,springCloud中的FeignClient接口,都是通过该接口实现的自定义注册逻)
2023-02-13 14:32:15 410
原创 spring(二)-----------如何注入bean
此时基于FactoryBean的基础上(为了使得接口能被实例化、Mapper所有方法基本执行相同的操作——找到对应的SQL,绑定参数,执行SQL然后返回结果),我们需要解决多个mapper对象注入简易化的需求。注意:往spring中注入类和注入对象是不同的概念,注入类是spring会接管类对象实例化、初始化等过程,而注入对象则是将对象的实例化初始化交由自己掌控。好了,到这里我们大概知道mybatis生成一个mapper对象了,下面我们需要考虑的是如何将这个mapper对象注入到spring容器中。
2023-02-11 19:17:24 915
原创 Hadoop之MapReduce
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一。其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,并发实例互不相干,但是他们的数据依赖于上一个阶段。它简单的实现一些接口,就可以完成一个分布式程序,当你的计算资源不能得到满足的时候,你可以通过。设计的初衷就是使程序能够部署在廉价的。并发实例,完全并行运行,互不相干。集群的客户端,用于提交我们整个程序到。流式计算的输入数据是动态的,而。作业的输出结果都会写入到磁盘,
2023-01-03 18:34:42 1039 1
原创 Hadoop之Hdfs
注意:配置优先级:(1)客户端代码中设置的值 >(2)ClassPath 下的用户自定义配置文件 >(3)然后是服务器的自定义配置(xxx-site.xml)>(4)服务器的默认配置(xxx-default.xml))思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0), 但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?因此,元数据需要存放在内存中。上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2022-12-30 15:24:16 380
原创 一、hadoop入门
是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统, Flume 支持在日志系统中定制各类数据发送方,用于收集数据;:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、 名字服务、分布式同步、组服务等。hadoop存在三种安装模式:本地模式(单机)、伪集群(同一机器,不同端口,一般不用)、完全分布式集群。不同于一般的关系数据库, 它是一个适合于非结构化数据存储的数据库。) 间进行数据的传递,可以将一个关系型数据库(例如 :MySQL。是一个分布式的、面向列的开源数据库。
2022-12-26 23:03:28 182
原创 牛客sql
一、查找最晚入职员工的所有信息描述有一个员工employees表简况如下:请你查找employees里最晚入职员工的所有信息,以上例子输出如下:最优解法select * from employees where hire_date = (select max(hire_date) from employees);当然会有order by排序后,用limit获取第一个元素,但这必须要在没有相同数据的情况下才可以学习:select 后要查询出聚合函数+字段..
2022-01-26 14:11:20 751
原创 Mysql复习
一、一条sql执行的步骤1、连接mysql服务端先在程序中加入mysql驱动依赖(用于连接mysql)注意:此时在客户端和mysql服务端,都存在各自的数据库连接池,主要用来限制和管理连接。客户端的连接池常见有DBCP、C3P0、Druid。2、mysql接收sql语句,并进行解析客户端通过连接发送sql语句到mysql,mysql有专门的线程监听sql请求,然后将sql传给SQL接口,由于此时这些语句mysql不能进行识别,所以需要sql解析器将sql语句进行解析。3、选择最
2021-12-28 13:25:44 761
原创 JVM(四)——GC调优案例
面试题什么是内存泄漏和什么是内存溢出 (陌陌)Java存在内存泄漏吗,内存泄漏的场景有哪些,如何避免(百度)Java 中会存在内存泄漏吗,简述一下?(猎聘)内存泄漏是怎么造成的?(拼多多、字节跳动)内存泄漏与内存溢出的区别 (字节跳动)Java存在内存溢出的现象吗 (字节跳动)Java中会存在内存泄漏吗,请简单描述。 (美团)内存溢出:内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一。由于GC一直在发展,所有一般情况下...
2021-12-09 14:52:28 1102
原创 jvm(三)——性能监控
一、面试题二、背景、概述1、为什么要进行调优?——防止、解决OOM;减少Full gc出现的频率2、生产环境中的问题1)、生产环境发生了内存溢出该如何处理2)、生产环境应该给服务器分配多少内存合适?3)、如何对垃圾回收器的性能进行调优?4)、生产环境CPU负载飙高该如何处理?5)、生产环境应该给应用分配多少线程合适?6)、不加log,如何确定请求是否执行了某一行代码?7)、不加log,如何实时查看某个方法的入参与返回值?3、可以根据什么方式..
2021-12-07 14:16:26 1328
原创 JVM(一)jvm运行结构简介
一、JVM和Java体系结构Java:跨平台语言,一处编译多处运行Jvm:跨语言的平台。(只关注符合规则的字节码文件,可以使用多种语言编写转化为符合规则的字节码文件就能被jvm解释运行)如下图:Jvm是运行在操作系统之上,和硬件没有直接的交互:虚拟机在软件层面上分为程序虚拟机(jvm等)和系统虚拟机(vm、安卓模拟器)Java虚拟机:执行jvm二进制字节码(只要符合jvm字节码规范的即可)(未必由java语言编译而来)的虚拟计算机。用于装载字节码到内部、解释/编译对应平..
2021-11-15 19:49:09 1960 2
原创 mysql DBA(五)innodb引擎
其中innodb就是图中的存储引擎。一、表空间、buffer pool、压缩表1、页在磁盘的数据文件中称为数据页,在mysql内存中称为缓存页。不过大小一般都是16k。页是IO交互的最小单位。(在磁盘文件和buffer pool交互的最小单位)可以对页的大小进行压缩,KEY_BLOCK_SIZE=4就是压缩为4k,此时这张表就是压缩表。但不是压缩的越低就越好,不同的场景压缩越低其指标不一样。row offset array:有序的存放指向各个row的指针...
2021-09-24 16:21:29 358
原创 mysql DBA(四)基准性能测试
一、磁盘类型和IOPS性能指标磁盘的访问模式:这里的顺序访问表示的是逻辑的顺序访问。硬盘又分机械硬盘和固态硬盘(SSD)。机械盘和固态盘的性能相差是很大的,性能相差几百倍。所以mysql尽量的使用ssd硬盘。1、机械硬盘:一般吞吐率(带宽)是用来衡量这个盘的顺序访问性能,IOPS用来衡量其随机访问性能。而mysql一般使用在oltp场景,所以随机访问的操作比较多。IOPS:有些厂商用上面的图表示IOPS,我们可以计算第一个的IOPS=48*1024...
2021-09-16 17:56:54 397
原创 mysq DBA(三)调优:sql执行计划
一、索引主键索引:每个表只能有一个唯一索引:字段的值是唯一的索引普通索引:普通字段的索引。索引底层是B+树结构的索引,mysql会对索引字段的值进行排序,排序完只会查询的速度才会很快。索引定义:一张表上可以有多个索引,指定后会对索引字段进行排序,排序的目的即为了快速的查询。B+树的缺点:插入时要对索引字段进行排序维护,维护代价比较大。1、B+Treemysql对数据储存是以页/块为基础的,其中叶子节点是有序的,且叶子节点之间是双向链表。B+树进行查找后,只能找到数.
2021-09-16 12:26:20 957
原创 mysq DBA(二)sql编程
一、数据类型、常用函数、编码一、数据类型数据类型主要分为5个类型:整型、1、INT类型具体有TINYINT(1字节)、SMALLINT(2)、MEDIUMINT(3)、INT(4)、BIGINT(8)常用的是INT类型,而且每个整型类型都有一个有符号(Signed)和无符号(UnSigned)类型,分别代表不同大小。例如我们现在创建一个z表,里面有个字段为a且其符号类型为无符号、另一个字段b为tinyint类型且有符号:create table z ( a int unsi.
2021-09-10 14:52:50 954
原创 自定义一个starter
一、springboot starterspringboot starter:引入相关依赖和初始化配置(自动配置)一般可以根据starter区分是spring官方还是第三方:二、自定义一个简单的starter一、案例一1、创建一个hello-spring-boot-starter并配置pom.xml文件aa...
2021-09-06 15:26:50 650
原创 Mysql DBA(一)
一、官方文档1、文档地址:https://dev.mysql.com/doc/可以对相应的命令、功能进行搜索2、下载https://www.mysql.com/downloads/进去开源版本的页面后:社区版和企业版的区别:
2021-09-04 16:06:39 1456
原创 redis(七)、运维配置注意
一、缓存设计一、缓存的收益和成本二、缓存更新策略三、缓存粒度控制四、穿透优化五、无底洞优化六、雪崩优化七、热点key重建优化二、开发运维的陷阱一、Linux配置优化二、flushall/flushdb误操作三、安全的redis四、处理bigkey五、寻找热点key五种数据结构底层实现,限流、lru、布隆过滤器、数据一致性、多路复用IO模型、零拷贝、分布式锁...
2021-08-10 11:04:49 2340 3
code-template-master.zip
2020-04-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人