- 博客(26)
- 资源 (2)
- 收藏
- 关注
原创 Spring源码分析之TDDL
其实tddl的实现逻辑并不难,就是创建多个datasource数据源,然后通过一个Datasource代理类统一控制每次调用哪个数据源。而datasource数据源可以不是真实的数据源,而是连接池比如Druid。所以tddl可以说只是一个类似于负载均衡的工具。当然涉及到具体细节,怎么优化性能,怎么监控等,考虑到各种细节之后,可能就没有那么简单了。1、使用方式<bean id="dataSource" class="com.taobao.tddl.group.jdbc.TGroupDataSourc
2020-11-24 22:12:30 657 1
原创 Spring源码分析之事务处理
1.TxNamespaceHandler的TxAdviceBeanDefinitionParser定义了TransactionInterceptor 的BeanDefinition2.TxAdviceBeanDefinitionParser定义了transactionManager和transactionAttributeSource3.通过transactionManager处理事务:getTransaction、commit、rollback4.通过transactionAttributeSour
2020-11-24 21:57:45 217
原创 Spring源码分析之注解分析
一、通过注解方式加载SpringAnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyBeanConfig.class);二、AnnotationConfigApplicationContext初始化reader和scanner,然后加载beanpublic AnnotationConfigApplicationContext(Class<?>... annotatedC
2020-11-24 21:53:39 294 1
原创 Spring源码分析之Bean的加载
一、通过加载xml方式启动spring(为了直观,去掉了干扰代码)new ClassPathXmlApplicationContext("applicationContext-xxx.xml");->this.setConfigLocations(configLocations);->this.refresh();public abstract class AbstractApplicationContext extends DefaultResourceLoader implemen
2020-11-23 22:02:35 231 1
原创 【数据库篇】MySQL源码分析之RowIterator(索引、排序、表关联源码分析)
上一篇文章分析了Mysql查询的整体逻辑,其中提到RowIterator是查询的关键,本篇文章则具体分析下RowIterator 的细节1、核心//sql_union.ccbool SELECT_LEX_UNIT::ExecuteIteratorQuery(THD *thd) { List<Item> *fields = get_field_list(); //查询到的结果 Query_result *query_result = this->query_resu
2020-11-01 23:00:31 815
原创 【数据库篇】MySQL源码分析之row_search_mvcc详细分析(Page加载及索引分析)
从上一篇文章了解到Innodb的查询最终都是通过row_search_mvcc执行的,接下来就来略详细的分析下row_search_mvcc的执行流程。本文主要分析查询逻辑忽略了部分细节,比如行锁表锁等处理,数据库事务的快照查询等。由于本人是Java开发并不擅长C++,只是看代码并没有进行调试,分析细节不对的地方还请指正哈~一、先理清楚row_search_mvcc的主要流程1.1、基本参数定义dict_index_t *index = prebuilt->index; //索引const d
2020-11-01 22:59:53 2421
原创 【数据库篇】MySQL源码整体分析
源码下载地址:https://github.com/mysql/mysql-server分析的是当前最新源码8.0.22的样子,这段时间才开始接触mysql源码,主要分析mysql的查询,后期在逐步分析插入和锁等内容。分析mysql具体功能前,先介绍下mysql整体运行流程,然后后面再具体分析功能模块。一、先介绍mysql入口及网络请求1.1、mysql的入口//main.ccint main(int argc, char **argv) { return mysqld_main(arg
2020-11-01 22:58:38 3767
原创 JDK动态代理和CGLIB比较
一、概述二、源码比较1、动态代理源码分析HelloImpl impl = new HelloImpl();LogHandler handler = new LogHandler(impl);Hello hello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(),handler);public class Proxy implements java
2020-09-27 12:41:54 136
原创 【redis篇】网络请求和命令执行是否都在主线程分析
一般刚学习Redis的同学都会了解到Redis是单线程的,好处比如天然防并发、避免上下文切换云云。那为啥单线程下性能反而会更好呢?我们仔细思考下这个问题。程序运行主要分为IO密集型和CPU密集型。IO密集型程序的运行时间主要消耗在比如磁盘读写等操作上,CPU大部分情况可能处于闲置状态,这种情况下CPU处理并发请求是游刃有余的,比如常见web性能瓶颈主要是在数据库。而CPU密集型则大部分时间主要是在执行CPU指令,本身满载运行再开启多线程
2020-09-13 20:45:20 439
原创 【JVM篇】变量定义在for循环内是否影响性能
一直有种优化java性能的说法,就是变量应该定义在for循环外面。虽然这样写了多年的for循环,但是依旧不习惯这种别扭的写法,可读性不好。那到底这么是不是提升性能呢,趁着复习jvm分析下for循环源码。1、首先将变量定义在里面public void for1(HSDBBean father) throws InterruptedException { for (int i = 0; i < 100;i++){ HSDBBean child = new HSDBBean("儿子",
2020-09-03 22:19:31 1524
原创 【JVM篇】垃圾回收
一、前言本篇文章主要摘自其他博客二、垃圾回收算法1.标记-清除算法(Mark-Sweep)最基础的收集算法是“标记-清除”(Mark-Sweep)算法,分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它的主要不足有两个:1.效率问题,标记和清除两个过程的效率都不高;2.空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
2020-09-03 21:24:55 146
原创 【JVM篇】Java类的对象创建
0.对象的创建是通过new指令执行的1.get_unsigned_2_byte_index_at_bcp 获取new对象在常量池中的索引存入rdx2.get_cpool_and_tags 将常量池首地址存入rcx3.tlab_allocate 如果空间足够在tlab上分配对象空间4.eden_allocate 在eden分配对象空间5.InterpreterRuntime::_new 估计是在老年代分配空间6.initialize_header 对象头内存循环置为07.初始化创建对象的_mar
2020-09-01 20:19:21 253
原创 【JVM篇】Java main的调用
执行jar的方法java -jar xxx.jarjava.exe的执行// \src\java.base\share\native\launcher\main.cJNIEXPORT int main(int argc, char **argv) { return JLI_Launch(margc, margv, jargc, (const char**) jargv, 0, NULL, VERSION_STRING, DOT_VERSION, (const_progname != NULL
2020-09-01 20:18:25 957
原创 【Hadoop篇】YARN源码分析(三)
0、回顾【Hadoop篇】YARN源码分析(二)NodeManager启动了YarnChild1、YarnChild分析1.YarnChild执行提交的MapTask或ReduceTask2.TaskUmbilicalProtocol将MapTask和ReduceTask处理结果反馈给MRAppMasterclass YarnChild { public static void main(String[] args) throws Throwable { final Job
2020-07-28 17:03:35 298
原创 【Hadoop篇】YARN源码分析(二)
0、回顾【Hadoop篇】YARN源码分析(一)NodeManager启动了MRAppMaster(MRAppMaster就是ApplicationMaster的一种实现)1、MRAppMaster统一管理这个Job的所有Task1.MRAppMaster启动RMContainerAllocator服务2.MRAppMaster注册、初始化、启动JobImpl3.JobImpl创建MapTask和ReduceTask,并提交给TaskImpl4.TaskImpl将Task提交给TaskAttem
2020-07-28 16:55:16 389
原创 【Hadoop篇】YARN源码分析(一)
0、总结1.hadoop其实是一个脚本2.该脚本调用RunJar调用HadoopWordCount.jar的main函数(脚本里面可能设置好了依赖库)3.调用job.waitForCompletion(true)提交4.YARNRunner设置MRAppMaster为ApplicationMaster5.JobSubmitter调用JobResourceUploader将HadoopWordCount.jar上传到hdfs6.JobSubmitter通过InputFormat算出需要的MapTa
2020-07-28 16:26:14 574
原创 【Hadoop篇】hdfs文件上传源码分析
0、上传文件代码FileSystem fs = FileSystem.get(new URI("hdfs://hadoopmaster:9000"), new Configuration(), "root");OutputStream os = fs.create(new Path("/test.log"));FileInputStream fis = new FileInputStream("I://test.log");IOUtils.copyBytes(fis, os, 2048,true);
2020-07-28 16:03:50 579
原创 【网络请求篇】记一次网络请求分析
下面是一段HttpClient使用例子,乍一看好像没有什么问题,执行请求,然后关闭,目前项目里面也基本是这么使用的。public static void test1(){ GetMethod getMethod = null; try { HttpClient client = new HttpClient(); getMethod = new GetMethod("https://xx.xx.com/xx.htm"); int status
2020-07-11 18:23:44 333
原创 【数据库篇】MySQL性能优化(读)
1.0 连接数配置1.1 MySQL对连接请求的控制max_connections参数控制MySQL的最大连接数,当并发请求数超过max_connections设置的值,将拒绝访问mysql> SHOW VARIABLES WHERE variable_name LIKE '%max_connections%'; +------------------------+-------+| Variable_name | Value |+--------------------
2020-06-27 20:07:10 485
原创 【数据库篇】MySQL InnoDB ibd 文件格式解析
mysql innodb的表由.frm .ibd 组成,frm:存了每个表的元数据,包括表结构的定义等;ibd:存了每个表的元数据,包括表结构的定义等;ibd文件结构由segment inode、extent和page组成。通过py_innodb_page_info可以查看某张表的ibd结构,如下面这个例子:page offset 00000000, page type <File S...
2020-05-07 23:29:42 21425 3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人