- 博客(100)
- 资源 (1)
- 收藏
- 关注
原创 2句代码解决Spring多线程事务失效问题
1、Spring事务的本质是为贴着@Transactional注解的方法生成代理对象(AOP),执行业务方法前把当前数据库连接(connection)的。3、解决方案:在开启新的线程的时候,手动把外层的connection存入子线程的ThreadLocal。,相当于开启了一个事务,然后把当前的connection存入ThreadLocal,最后未报错则提交事务,报错则回滚事务。2、在1的基础上,如果有其他事务加入,则会从ThreadLocal中去获取connection,因为。
2026-01-17 15:14:55
49
原创 手写动态线程池(开箱即用版)
1、利用MyImportBeanDefinitionRegistrar来动态注册Bean,动态读取注解和配置信息来注册多个Bean(线程池),用它(对比BeanFactoryPostProcesser)不仅职责明确 还可以适配其它项目开箱即用的优点,通过注解即可使用。3、利用SmartLifecycle在Spring容易启动完(bean都创建完之后),启动定时任务,监控Map中线程池的情况告警。额外的,引用方如果要接入查看、修改线程池参数的接口,就调用被引用方的DtpService.java里的方法。
2025-12-29 14:27:25
426
原创 订单超时方案的选择
2、在电商业务下,许多订单超时场景都在。3、甚至在简单的单体系统中,可以用。没有垃圾的技术,只有垃圾的开发。DelayQueue来实现。
2025-10-08 21:03:00
296
原创 Mysql:由逗号分隔的id组成的varchar联表替换成对应文字
这样子,查询出来的tagName就是tagIds对应的标签名字,也是用逗号分隔。
2025-09-05 15:31:36
238
原创 定位哪一行代码导致CPU飙高
2、通过top命令,按shift+P 按CPU占用排序,找到飙高的进程ID,即pid;公式:jstack 进程id | grep 16进制线程id -A 20。3、ps H -eo pid,tid,%cpu | grep 进程id。1、死循环飙高CPU,while true打印UUID即可;解读:根据进程id找到导致CPU飙升的线程id,即tid;4、线程都是16进制,将线程id转换为16进制。公式:printf ‘0x%x\n’ 线程id。得到3762的16进制:0xeb2。6、寻找公司包名的问题行。
2025-01-06 12:13:55
214
原创 前端切换页面时,保存滚动位置
在A页面时滚动到某位置,切到B页面,再切回A页面时保留滚动的位置。原理:切出A页面时记录下高度,切回A页面时恢复高度。
2024-11-04 11:52:07
464
原创 Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存
Guava的缓存类似于redis。比起Redis,Guava的缓存优势在于更轻更快,而Redis的优势在于支持分布式。
2024-10-08 17:51:39
737
原创 Java把文件链接转成流,返回给前端下载
背景:已知Java拿到了一个PDF链接(http://xxx.xxx.pdf),直接把链接返给前端的话,前端是不能点击直接下载的,需要后端先。这样前端一点击,就能。
2024-08-26 16:17:52
1461
原创 干货!完全体设计模式!工作中最常用
用于挪去臃肿的业务代码,还可以进一步升级加上模板模式,以及抽取成Starter。首先,抽象的处理业务的Handler,也就是 “模板”用于干掉大量的if-else。其次,模板的一种具体实现。然后,工厂的注册和生产。
2024-05-14 20:08:53
367
原创 批处理任务的通用工具类
1、只要是批处理任务(比如下发几万张优惠券,发京豆),就必定用到线程池、不丢包。2、业务场景:下发五万张优惠券,要求一张都不能少。
2024-05-04 11:08:29
437
原创 扫码登录到底是怎么实现的?
2、接着,APP 扫描这个二维码,把 APP 的 token 信息、二维码 ID 发送给 Server 端,4、于是,用户确认登录后,携带临时 token 给到 server,server 端修改二维码状态。3、此时,网页端展示的二维码状态会提示已扫码,待确认。不难发现,整个实现过程并不难,核心的设计就是一个特定的二维码,去连接了 APP。1、首先,在网页端打开登录页面,展示一个二维码,这个二维码有一个唯一编号是服。5、最后,网页端轮询到状态变化并获取到 token,从而完成扫码授权。提示确认授权的操作。
2024-03-27 11:20:51
1625
原创 Mysql相关
B树相对于AVL(平衡二叉树)来说,AVL树每个节点只能有2个子树,而B树允许有多个子树,这样可以大大降低树的高度,树的层数越多,磁盘IO次数就越多,B树的高度低,层数少,所以磁盘IO次数少,适合作为硬盘存储的数据结构;B+树是B树的进一步拓展,B+树只有叶子节点才存储行数据,而每一层存储的数据量有限,这么设计可以进一步降低树的高度,减少磁盘IO次数,加快查找速度。索引的数据结构是B+树,为什么要用这个数据结构?
2024-03-25 16:35:23
288
原创 开发运维小技巧记录
1、查看服务器的内存大小命令是 free -m。2、查看服务器的任务管理器命令是 top,再按shift+M 按内存占用排序。按shift+P 按CPU占用排序。按shift+T 按耗时排序。
2024-03-22 16:47:57
203
原创 TopK问题
堆在Java中的实现是优先级队列:PriorityQueue。(找最大数用小顶堆,找最小数用大顶堆)比如从100万个整数中找出最大的100个整数,如果进行排序,时间复杂度是O(nlogn),代价高昂。可以看到,性能相差了三倍,并且数据量越大,性能差距也越大。来解决,时间复杂度是O(nlogK)TopK问题的解法是:用数据结构。
2023-12-28 10:50:01
601
原创 线程池里对异常的处理方式
=方式:==重写afterExecute方法, 统一处理线程池里抛出的异常。但是要区分是execute方式提交的,还是submit方式提交的。
2023-10-29 09:11:09
432
原创 烟花效果,H5+C3+JS实现
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>11
2023-10-09 12:33:00
514
2
原创 Mybatis中的一级缓存与二级缓存
二级缓存是NameSpace级别(Mapper)的缓存,多个SqlSession可以共享,使用时需要进行配置开启。(2)缓存的查找顺序:二级缓存 => 一级缓存 => 数据库。(1)MyBatis的缓存分为一级缓存和 二级缓存。一级缓存是SqlSession级别的缓存,默认开启。
2023-09-13 08:53:35
137
原创 Redis相关知识
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。更快,也更不安全的选择。
2023-09-13 08:49:39
316
原创 线上排查定位OOM问题的记录
1、分析快照文件的工具建议用eclipse analyzer,而不是jdk自带的jvisualvm。eclipse analyzer的下载地址:http://www.eclipse.org/mat/downloads.php。整体思路:把机器上的快照文件下载到本地电脑,用eclipse analyzer打开它,找到是哪一行导致oom。因为快照文件很大,eclipse analyzer设置的大小阈值也要调成足够大。把该文件下载到本地电脑,可以借助xftp等工具下载。2、解压缩后,先编辑下这个文件。
2023-08-30 15:18:38
303
原创 用ThreadLocal做链路追踪(初版、升级版、最终版)
于是出现了升级版(InheritableThreadLocal):解决了初版的问题,但是当线程池中开辟线程时,线程复用会残留上一次的trace-id,导致混乱不准。初版(ThreadLocal)的缺点:当new新线程时,子线程获取不到父线程的变量,导致trace-id丢失。2、当我们写的接口接收到其它地方(可能是前端、也可能是其它服务)发来的请求时,此刻,我们的接口所在的服务称作。服务端的日志打印很好做,用过滤器Filter即可,每次请求打过来,记录下请求路径、请求头、参数。
2023-08-14 10:19:50
595
原创 读书之《被讨厌的勇气》
在理解了学习是孩子的课题这个基础上再去考虑能做的事情,具体就是不去居高临下地命令其学习,而是努力地帮助他本人建立“自己能够学习”的自信以及提高其独立应对课题的能力。3、既不可以批评,也不可以表扬。表扬这种行为含有“有能力者对没能力者所做的评价”。人表扬他人的目的就在于“操纵比自己能力低的对方”。“因为不想与父亲和好,所以才搬出被打的记忆”。那么“关系修复之卡”就我在我手里,只要我改变“目的”,事情就能解决。5、“因为被打所以才与父亲不和”,那么只能束手无策了。2、“可以把马带到水边,但不能强迫其喝水” –
2023-07-16 21:31:54
196
原创 匿名内部类.getClass()结果
匿名内部类是继承了指定的类或实现了指定接口的类,我猜想它的class类型应该和该类(接口)相同,但实际发现不同。public class M15 { public static void main(String[] args) { Runnable runnable = () -> { }; System.out.println(runnable.getClass()); System.out.println(Runnab
2022-05-22 14:49:01
577
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅