待阅读

待阅读的博文/博客

记录一些不错的博客和文章

Read more

TCP理解

建立一个 TCP 连接的本质:

TCP 是双向的,双向都能传输数据。要保证双向都能可靠传输数据就需要两边都维护传输数据的序列号,这个序列号是所传输的每个子节点的编号,是一个 32 位无符号数,到达最大值再循环从 0 开始。三次握手(建立 TCP 连接)是为了交换双方的所要传输数据的初始序列号。

Read more

SpringBoot无法启动问题排查

背景

在维护的项目使用了 SpringBoot,常规本地运行都是直接用 main 方法去跑。有一个需求需要在 Spring 容器启动前增加一些操作,因为测试和线上环境其实都是打 war 包去部署到 tomcat 中去的,和 main 方法稍微有些不同。所以就去尝试本地也用 tomcat war 包部署的方式去启动,但是碰到了一个麻烦的问题。在运行的时候会运行很长时间,而且进程占满了一个 cpu。

Read more

使用Java枚举碰到的一个问题

enum 的一个问题

有这样一个场景,服务端序列化一个枚举类并传递给客户端,开始是没有问题的。但是当服务端增加一个枚举值而没有通知客户端的时候,客户端反序列化就会报异常了。

Read more

对待工作的态度

前段时间和大学同学聚会,我是个3年+的Java后端了,和同是后端的同学聊起技术,聊起公司。有同学比较厉害,已经成为一家创业公司的team leader了,饭局结束后直接问我要不要去他公司。
当时没有直接回复他。后来又有问我要不要去,架不住热情就说了个冠冕堂皇的理由,我说「我对现在的工作还没有做到满意」。

Read more

MyBatis自定义枚举类型处理

直接上代码

需要自己去继承BaseTypeHandler来实现自己的类型转换。注意 @MappedTypes 是需要映射枚举类型,MappedJdbcTypes 是映射成的数据库字段类型。

Read more

数据库隔离级别和各个级别下的缺点

2021-01-20 更新

Mysql RR 级别,使用 next-key lock(record lock + gap lock)解决了当前读的幻读问题,但是还是有一些场景能重现出幻读问题,就比如:

  1. create table ab(a int primary key, b int);
  2. Tx1:
    begin;
    select * from ab; // empty set
  3. Tx2:
    begin;
    insert into ab values(1,1);
    commit;
  4. Tx1:
    select * from ab; // empty set, expected phantom read missing.
    update ab set b = 2 where a = 1; // 1 row affected.
    select * from ab; // 1 row. phantom read here!!!!
    commit;

例子来自:https://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads

2021-01-07 更新

对幻读加一个总结,RR 下的幻读其实是「快照读不存在,当前读存在,而且是针对的新增数据来说」,一会儿有,一会儿没有,像幻影一样。

2018 - 04 - 19 更新

今天突然感觉对 RC 下的不可重复读不太理解了,然后找了些网上的资料回顾下。比如 MySQL 四种事务隔离级的说明,发现大家在测不可重复读和可重复读的时候,都只直接用 select 去查的,也就是快照读。但是其实 RC 和 RR 下都是有 MVCC 的,自己又弄了几个例子测了测。本来理解的是无论 RC 还是 RR,只要在一个事务内的 select 都应该返回一样的结果。RC 下的不可重复读应该是对当前读来说的,RC 下的快照读本来也以为是能两次查询返回一致的。但是自己跑去测了下发现 RC 下两次读其实能读到其他事务提交的新数据,但是对数据的更新读取不到,还是只能读取到快照。

2018 - 03 - 02 更新

幻读:同一个事务的两次查询(delete insert update 触发唯一约束也算查询)第一次查没有,第二次查又有。幻体现在开始看没有,转头一看又有了,跟平时理解的幻觉有点相反。平时理解的幻觉是当时看有,之后看没有,怀疑当时出现了幻觉。

Read more

技术学习的路径

像点样子的大公司社招都是会去招聘最好的人,就是某个领域或者多个领域有比较深的能力,然后又有一定知识广度,能独挡一面。最近尝试面了几家公司,发现了自己的很多不足,比如:

  • 很多知识一知半解、不够透彻
  • 所做项目并没有很值得述说,也就是没有亮点
  • 了解的不少,但是真正清楚明白的不多,真个的原因一方面是学习过的东西总结做得比较少,一方面是学习的时候深入理解的不够

自己一直以来的学习习惯都是随便抓一样东西,看几篇文章敲几个用例,都比较一知半解,这样是不行的。真正比较好的学习方法应该是先囊括几个领域,比如数据库、分布式计算、中间件等、JVM,然后再从这些根节点出发去学习更多相关的知识,就像是一棵树,慢慢往下衍生,越往下就越深入。当然囊括根节点的时候需要寻找几个相关的节点,如果是后端为主,那么就不要去弄什么前端了,Java图形相关也不应该涉猎。这个的原因很简单,人的精力优先,再聪明的人也无法在所有领域都能深入和精通的。更何况自己这样精力不是很多,时间上更是会受限制。

Read more

深入Java虚拟机笔记

GC

GC需要处理的是:哪些对象没用了需要清理、什么时候回收、如果清理

哪些对象需要清理?

判断一个对象是否需要回收有两种方式:引用计数方式、可达性分析算法

引用计数方式

对对象的引用进行计数,计数为0则是需要清理的对象,>=1则是需要持有的。无法处理的问题是在循环引用的时候是无法处理。这只是一个描述GC理论说法,其实没有真正的JVM是中这种算法实现的。

Read more