- 博客(25)
- 收藏
- 关注
原创 一次CompleteFuture线上内存彪高的问题排查
将大数组拆分为多个小数组,并且clear掉最大的引用数组,每一个子任务引用不同的数组对象,任务完成时回收各自引用部分;任务处理耗时(15分钟超时)远大于请求处理时间,导致对象无法及时 GC。线程池队列快速填满(queueCapacity=200),触发。数据量过大时(如 10w+ 级别),瞬间向线程池提交海量任务。所有 CompletableFuture 持有任务对象引用链。无法释放方法栈中的集合对象引用(:每个子任务仅持有子集数据引用。:处理完的父集合立即解除引用。:将大集合拆分为子批次。
2025-03-04 15:44:50
292
原创 关于异步线程池使用以及线程饥饿的思考
线程饥饿指的是在多线程并发执行时,由于某些线程长时间无法获得执行所需的 CPU 资源或系统资源,从而导致这些线程的任务一直处于等待状态,严重时可能使这些线程永远得不到执行。本质:资源竞争:多个线程争夺有限的 CPU 时间片、锁或 I/O 资源,部分线程因为优先级低或调度策略原因,无法获得执行机会。任务提交过快:在异步任务提交中,如果使用了单一线程池且任务提交速度远大于线程执行速度,可能会迅速将线程池队列填满,进而触发线程池的拒绝策略。拒绝策略问题:例如,当采用。
2025-02-24 20:30:59
459
原创 记一个数据库连接池导致内存溢出的bug
排查后怀疑是使用的数据库连接池有内存溢出,因为是C端项目,不存在时间或者业务很复杂的查询,排除慢SQL的可能性,增加链接超时未归还泄漏的告警,监控链接池的情况;该配置控制连接可以被借出多久;超过该时间将打印连接可能泄露的日志,最小允许的值为 2000,单位 ms;该配置只是会在长时间未归还数据库连接的时候,打印告警日志,并不会影响链接的实际执行;在项目中,发现有服务的内存一直增长无法回收,可能有内存泄漏的问题;
2025-02-11 17:49:44
216
原创 阿里云数据库查询强制走主库工具类(结合mybatisPlus)
在开发过程中,发现有重复数据插入,在排查确定redisson和事物开启都没有问题的情况下,开始怀疑是否是数据库主从的问题,但是Rds官网介绍的开启事物之后,走的都是主库,但是对这里存疑,还是按照官方的介绍,接入了手动指定查询主库的方式;使用TransmittableThreadLocal,通过工具类保存是否进行强制查询走主库/从库 ,使用完后需要手动调用清除方法;结合mybatisPlus的切面,完成实现;
2025-02-11 16:47:14
232
原创 编程式事物TransactionTemplate
TransactionTemplate 是 Spring 框架中用于编程式事务管理的工具类。它简化了事务管理的代码,允许你在代码中显式地控制事务的边界。
2025-02-11 14:16:16
541
原创 Spring事物管理器TransactionSynchronizationManager概解(保证事物提交后执行)
在项目迭代中,遇到了一个需求,一张类似于子表,它的取值取决于两张父表的数据,如果B父表有数据,优先取B父表数据,否则取A父表数据进行子表数据生成,父表的数据变更本身涉及事物,并且是基于已有的功能增加,想写一个通用的方法,去刷新子表的信息,对于原逻辑侵入性较小,但是这里存在一个问题,就是刷新如果在子方法中,需要在原有逻辑的事物提交后,才可以读取到事物的修改,这里了解到可以通过。绑定事务相关的资源,并提供了丰富的 API 以便于开发者监控和控制事务生命周期。,确保事务的上下文在同一线程内可用。
2025-02-06 18:12:51
1011
原创 JAVA实现方法调用失败重试
这里使用Google的一个开源包,guava包进行实现,这个包里包含了很多好用的工具类,包括但不限于本地缓存,集合工具包等,我们今天从重试的角度来,使用guava包进行快速的方法重试构建;把方法大致分为无返回值,返回任务执行结果类型,以及有返回值类型三种,大致的代码示意如下,满足日常中的基本需求;
2024-12-16 15:45:02
242
原创 使用CompletableFuture进行多线程时未指定线程池踩坑ClassNotFoundException
CompletableFuture广泛应用于快速构建异步线程调用,在使用过程中,不当地使用可能会导致属性注入的service或者Mapper持久层,ClassLoader未能正常获取类,导致ClassNotFindException,该问题的发现也是在部分代码的书写中,有部分地方忘记配置线程池,从而导致了问题的出现。CompletableFuture在没有指定工作线程池的情况下,会使用默认提供的forkJoin线程池,在Tomcat容器中,tomcat没有直接使用jdk8原生的。
2024-10-17 16:29:53
285
原创 基于Redisson以及匿名函数实现简单的分布式锁事务工具
如果需要比较高的自定义情况,例如锁的持有时间和等待时间,等待锁或者非阻塞锁,可以通过类似的方式实现;重写事务日志打印:验证事务提交以及分布式锁释放的先后逻辑。
2024-10-17 16:04:24
238
原创 使用MybatisPlus以及MySQL JSON数据时踩的一些坑记录
我的解决方式可能不是最优雅的,但有效,暂时没太多时间去研究最优雅的解决方式,因为我感觉这里的泛型,应该可以通过注解配置或者指定局部变量specificType也使用泛型的方式更加优雅地实现,记录一下我现在的做法;在使用对象作为JSON字段的映射时,在实体类上要加上autoResultMap的配置,否则会导致在反序列化时,对象不能够正确映射到实体类;第二步:在使用到具体数据类型Entity的地方,重写该Entity的反序列化配置类。1.首先先配置一个基类,指定数组类型的反序列化基础;
2024-08-30 09:48:33
415
1
原创 Win10配置阿里DNS域名解析服务
这个DNS百度不一定好找,搞个文章记忆一下。6-找到对应协议(通常为ipv4协议)百度DNS:180.76.76.76;2-选择 ‘网络和Internet’7-属性-使用下面的DNS服务器地址。阿里DNS:223.5.5.5;谷歌DNS:8.8.8.8等。
2023-08-21 10:04:33
982
1
原创 Elasticsearch exception [type=mapper_exception, reason=timed out while waiting for a dynamic mapping
报错信息大概是文档在映射时发生了超时,我的原因是fastjson在序列化时,自动忽略了为null的值,导致对象解析时缺少了对应的字段,导致Es插入文档时变慢超时;同样的思路如果发生此类的报错信息,那优先检查一下index的mapping结构和插入的document的结构是否存在差异。顺带将FastJson依赖更新为了FastJson2。
2023-05-30 16:00:45
669
1
原创 Redis采用ZSet存入JSON字符串,取出后反序列化报错即解决方案
Redis 使用ZSet数据结构保存JSON格式的数据,在入到Redis后反序列化时发生了错误: 原因是到Redis中存储时,给每一个字段前加上了反斜杠,不能直接使用JSON直接反序列化。
2022-06-14 15:41:56
3396
原创 Java后端配置跨域实例代码
跨域配置类://配置跨域@Configurationpublic class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAll.
2022-02-15 11:07:32
646
原创 Java整合Redis高性能框架Lettuce单机版实例
Lettuce配置:/** * Lettuce客户端配置 */@Configurationpublic class LettuceRedisConfig { @Value("${spring.redis.database}") private int database; @Value("${spring.redis.host}") private String host; @Value("${spring.redis.password}") .
2022-02-15 10:37:41
2616
原创 POI原生方法导出复杂Excel示例代码
public ResponseBean exportExcel(QueryData data, HttpServletResponse response) {//省略数据准备代码,根据具体业务完成数据准备//导出模板HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet();//表头,createHeadCellStyle方法见下方代码,主要就是关于excel样式的设置HSSFCellStyle he.
2022-02-15 10:17:24
1052
原创 Mybatis使用databaseIdProvider属性实现不同开发环境下,对多种数据库的支持
看技术中台源码,对于两个不同版本的数据库——MySQL和Oracle数据库,都能支持,比较好奇是怎么实现,看了一下是使用到了databaseIdProvider这个技术。启动类中通过注解的方式配置了mybatis的databaseIdProvider配置。@Beanpublic DatabaseIdProvider getDatabaseIdProvider() { DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdP
2022-02-14 17:06:09
1216
原创 oracle恢复误删除数据/数据回滚
第一步:-开启行移动功能alter table 表名 disable row movement第二步:-指定回滚时间flashback table 表名 to timestamp to_timestamp('2022-01-18 10:00:53','yyyy-mm-dd hh24:mi:ss')第三步:-关闭行移动功能alter table 表名 disable row movementRow Movement该功能默认关闭,如果开启,一次更新操作可能会被分
2022-01-18 15:36:12
3189
1
原创 Oracle自定义函数
使用Navicat的话,可以点击函数,新建函数,根据引导完成一个函数的基本搭建。语法和Java类似,其中对于变量赋值要使用 :=进行赋值。具体语法可以参考一下https://blog.youkuaiyun.com/libertine1993/article/details/47264211其中遇到一个问题,在函数定义好之后,调用函数时候出现一个“ORA-29275: partial multibyte character” 的错误,大概是由于数据库的语言环境变量和本地环境不一致。解决方案是......
2021-08-19 15:45:07
1698
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人