自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 项目亮点归总

经过前后日志对比发现是在父事务中查询该指令后生成的,这个是因为hibernate的autoFlush机制:因为事务A修改了父子共享的session中的数据,导致父事务查询的时候也生成了一条update语句,这一条语句生成了行锁,并且这条行锁需要等到父事务结束后才会释放。排查日志后发现父事务出现了超时的问题。订单系统涉及到的异步操作主要集中在与第三方的交互中,例如用户开户后需要发送指令(订购商品,停复机等)给多个第三方,并且要等到所有第三方回调成功后,订单才能继续往下走,进行资源出库归档订单等操作。

2025-05-29 15:22:29 212

原创 浅谈消息队列

解耦:消息存储在消息队列中,就算各个服务系统宕机了,消息也不会丢失异步:生产消息发布到队列后生产者端可以继续做其他事。可加快系统的访问速度,提供更好的客户体验。削峰:部分接口在特定时间,例如秒杀,可能存在短时间大量访问。通过消息队列可以让系统按照自己的最大处理能力去处理请求。

2025-05-29 15:10:41 791

原创 设计模式及使用场景

单例模式即全局只有一个对象实例,可以通过锁的方式来实现,例如在一个类中声明一个对象,然后检查这个对象是否为空,如果不为空则加锁后实例化该对象,再解锁。即可保证只有一个对象实例。Spring的Bean管理默认就是单例模式。

2025-05-27 15:27:58 187

原创 Redis

适合读请求比较多的系统。- 写:更新数据库,直接删除cache- 读: 优先读取cache,读不到则从数据库读出来后返回,再更新到cache中- 缺点:第一次读肯定不在cache中 + 频繁写会造成cache频繁删除。。- 写:更新缓存,然后同步更新DB。- 读:优先读取Cache,不在存在则从数据库读出来,先写入Cache再返回。与读写模式一致,只不过更新数据库的操作是异步完成的- 不主动删除,等到数据被访问时检查是否过期,过期时删除。

2025-05-26 17:26:12 889

原创 分布式八股

获取锁的时候也会访问所有的节点,只有超过半数的节点一致时才会被认为是正确的结果(超过半数的节点加了锁或者没有加锁)。即在2n+1个从节点中部署哨兵,监测主节点是否宕机,如果超过一般的哨兵认为主节点发生宕机,则根据算法选举出新的主节点。锁最好不要提前释放,因为我们无法准确预估每个线程占有锁的最大时间,所以在定时到期时,我们可以使用redisson的看门狗机制为我们的锁续费。锁最好还能定时释放,避免释放锁的线程挂掉了死锁问题:使用命令SETNX KEY = VALUE EX 3,使锁3秒后自动释放。

2025-05-23 10:04:26 288

原创 垃圾处理GC

复制:将堆内存空间分为两部分(from和to),扫描from时将不能清除的数据复制到to中,然后清空from,如此反复。- 新生代用于存储新对象(edn区域),在经过minorGC之后放入survivor区域,并分为S0和S1区域使用复制算法交替MinorGC。- 标记移动:先标记一遍,然后将存活的对象朝一边移动,适合老年代区域,可以避免内存碎片,但是移动消耗巨大。- 分代算法,分为新生代,老年代(即GC次数少和GC次数多的区域)分别使用不同的算法。- 堆内部结构分为三部分,新生代,老年代和永生代。

2025-05-21 20:37:23 101

原创 并发八股 资料

- Violate - 用来声明字段具有可见性(而非原子性):被violate声明过的字段可以保证被其他线程访问到。但是不能保证原子性:例如每个线程都能访问count,但是不能保证大家都按顺序执行count++, 有可能重复或者缺少++的次数。 - 禁止JVM重排序:JVM是有可能重排序我们的代码指令顺序的,violate关键字可以保证按顺序执行,例如new一个对象,第一步是为对象创建一个内存地址,第二步时初始化对象,第三步是将对象指向内存的地址。我们期望是1,2,3.但是有可能

2025-05-21 17:17:04 152

原创 如何使用jvm或arthas调优,排查CPU飚高问题/ 排查OOM问题

如果出现CPU占用高+线程Block状态: 可能存在锁竞争导致的死锁,需要根据代码堆栈中的调用链排查方法,进而检查等待的锁和持有锁的线程为什么没有释放。)线程执行的方法调用链,是否有死循环或耗时长的超时操作。如果出现CPU占用高+线程Runable状态: 可能存在代码死循环,复杂度过高的场景,需要根据代码堆栈中的调用链排查方法。如果出现CPU占用高+频繁GC的场景:可能出现内存泄漏,需要根据jmap查看堆内存和对象分布。2. 再使用top -p [pid] -h 命令找到进程内CPU飚高的线程。

2025-05-20 16:44:11 208

原创 浅谈Spring

是一种更为方便的代理方式,即不针对特定类的代理方式。它通过反射机制获取到要代理的类的变量以及方法,同时生成了一个代理对象(实现了InvocationHandler),通过这个代理对象可以访问要代理类的变量以及方法。当Spring初始化时,如果识别到有切面配置的Bean,则会为其类创建代理对象并放入Bean仓库,在之后通过AutoWired在其他类中引用时,实际上引用的是Bean仓库中的代理对象。这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

2025-05-15 15:09:35 154

原创 数据库优化 + 执行计划分析

基础思想就是使用多个数据库,其中一个作为主库用来写入数据,然后同步到其他数据库并承接读操作。的实现原理为利用了主数据库的binlog持久化文件,会存储所有的写入操作,然后同步给从数据库- 如何避免复制延迟?- 同步完成前,将从数据的读操作路由到主数据库- 如果业务没有强要求,可以手动设置延迟0.5s到1s左右。例如支付完成后跳转到支付成功页面,需要用户手动返回用户中心才会查询支付详情。

2025-05-09 11:06:11 148

原创 ​LongSql问题分析办法​

概述。

2025-05-08 09:30:07 394

原创 auto-flush机制导致主键冲突的问题

而是在第二个子订单的重复校验(查询订单表)中触发了auto-flush提交了insert语句。但是在此时在提交完订单表的insert语句后,提交订单相关表的insert语句中时由于订单相关表过大,或者数据库压力过大导致超时。接着,代码catch住了auto-flush抛出的异常,并且又查询了一次订单表,此时由于之前autoFlush失败,session中还是存在脏数据,所以会再次触发autoFlush,最终导致insert主键冲突。- 背景:批量创建订单流程中,创建子订单时出现子订单ID冲突。

2025-04-29 16:37:15 226

原创 如何解决hibernate的autoFlush机制造成的父子事务死锁问题

在我们这个场景中,由于父子事务共享的是一个hibernate的session,所以子事务更新订单表实例后也同时更新了共享session中的订单实例(脏数据),所以在父事务中查询时识别到这个是脏数据就生成了update语句。第二种方案则是将两个独立事务都合并到父事务中变成一个事务,但是这个会导致如果中间执行失败,会回滚所有更新语句,导致状态丢失。但是问题就出在了接下来的独立子事务中又更新了订单表状态,那么在子事务B结束尝试提交时就会陷入死锁,一直等到父事务最大等待时间到了之后整个进程结束,订单卡死。

2025-04-29 16:20:59 283

原创 JAVA科目二

科目二复习资料

2022-08-01 16:26:43 2939

空空如也

空空如也

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

TA关注的人

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