数据库更新慢之谜:从10秒到瞬间的优化探索
需积分: 0 62 浏览量
更新于2024-08-03
收藏 832KB PDF 举报
"文章主要讲述了在某个项目中,一个UPDATE语句执行耗时长达10秒,引发性能问题。经过分析,发现问题出在RPC调用的重试机制以及服务内部的异步任务处理上。更新语句本身没有问题,但服务在更新后还有两个异步任务,在某些情况下这些任务在原事务线程中执行,导致事务持续时间延长。通过调整线程池配置,解决了这一问题。"
文章详细内容:
在本文中,作者首先描述了一个实际遇到的问题,即一个UPDATE语句执行时间异常长,达到10秒,这在高效运行的系统中是不可接受的。问题发生在2022年7月的一个晚上,测试人员报告了一个后台更新信息的性能问题。
接着,作者进行了问题分析,发现该UPDATE语句被调用了两次,第一次执行超时,第二次执行时间缩短,这是由于RPC调用的重试机制(retry=1)所致。通常,对于数据库的增、删、改操作,不应设置重试。进一步调查发现,UPDATE语句本身没有明显性能问题,因为它只是基于主键ID进行更新,按理说应该非常快。
作者怀疑问题可能在于服务的其他部分,经过IDEA的代码审查,发现服务B在执行UPDATE语句后,还在事务提交前触发了两个异步通知任务,这些任务使用了Spring的@Async注解和自定义线程池。关键的问题在于,有时这些异步任务会在原事务线程中执行,而不是预期的独立线程,这可能导致事务的生命周期被延长。这种情况并不总是出现,有时异步任务会正常在线程池的线程中执行。
通过对线程池配置的深入调查,作者发现了问题的根源——线程池的callRunner失败策略。当异步任务在原线程执行时,事务会保持开放状态,直到所有任务完成,这解释了为何UPDATE语句执行如此之慢。
最后,通过调整线程池配置,确保异步任务始终在新线程中运行,从而解决了这个问题。作者总结,对于这类性能问题,需要全面考虑服务的整个流程,包括事务管理、异步任务执行以及线程池配置,以确保系统的高效运行。
2020-01-04 上传
2020-01-04 上传
317 浏览量
2023-05-27 上传
2023-06-09 上传
2023-05-26 上传
2023-11-18 上传
2023-09-28 上传
2023-06-01 上传
白话机器学习
- 粉丝: 1w+
- 资源: 7673
最新资源
- JDK 17 Linux版本压缩包解压与安装指南
- C++/Qt飞行模拟器教员控制台系统源码发布
- TensorFlow深度学习实践:CNN在MNIST数据集上的应用
- 鸿蒙驱动HCIA资料整理-培训教材与开发者指南
- 凯撒Java版SaaS OA协同办公软件v2.0特性解析
- AutoCAD二次开发中文指南下载 - C#编程深入解析
- C语言冒泡排序算法实现详解
- Pointofix截屏:轻松实现高效截图体验
- Matlab实现SVM数据分类与预测教程
- 基于JSP+SQL的网站流量统计管理系统设计与实现
- C语言实现删除字符中重复项的方法与技巧
- e-sqlcipher.dll动态链接库的作用与应用
- 浙江工业大学自考网站开发与继续教育官网模板设计
- STM32 103C8T6 OLED 显示程序实现指南
- 高效压缩技术:删除重复字符压缩包
- JSP+SQL智能交通管理系统:违章处理与交通效率提升