当前位置: 首页 > news >正文

记一次奇异的bug

很久以前,写过一个java版通用Excel导出插件。最初版本中,从数据库获取数据是一次性获取。刚开始没什么问题。使用几年以后,用户反馈下载长时间范围的数据,会非常卡,甚至会出现错误。

性能问题,做了一次分析后,发现主要是读取数据用时非常长。使用了几年,数据库中的数据超过千万,下载查询是否会使用到索引,这个不可控。基于此,想到了分页读取生产的思路。

改好代码测试无误,上线有几年了。昨天用户反馈,下载的数据内容有问题,有些数据重复,有些数据缺失,但是总条数又对的上,而且连续两次导出的文件,内容有差异。

脑子的第一反应就是,用户是不是使用了表关联导致的。去现场仔细查看前端页面配置,没有用到任何表关联。加之用户不懂it,在叙述中只是讲业务如何核对数据,而我恰巧也忘记了加分页读取的事。所以一直在业务数据异常和sql异常两者之中徘徊。最终无果之下,跟客户讲,我回去捋一下代码逻辑看看,并且让他们把db的内容备份给我。

回到座位,点开代码一层层核查,在代码中看见了分页,顿时脑子中想到了以前解决过的一个bug。sqlserver数据库,在分页查询的时候,一定要使用orderby,不然记录出现的顺序会有一定的随机性,正好符合客户描述的现象。我核查dao层代码,发现有在前端未传递排序字段的情况下,给予默认排序字段,该字段为create_date。拿着sql在库里查询,发现有大量相同create_date的记录。于是跟用户讲,代码有缺陷,讨论得出我再统一插件中进行修改。将id加入排序字段内。

在所用使用到这个通用导出模块的地方,都有id字段,且id字段唯一。这样修改即可解决问题。

这个问题的关键就在于,数据库排序在多次执行时,会将排序字段完全相同的数据随机返回。解决的关键就在于,使用唯一键或者主键来防止出现这种情况。

http://www.lryc.cn/news/614889.html

相关文章:

  • 自动化一键部署 LNMP 环境
  • 【n8n教程笔记——工作流Workflow】文本课程(第二阶段)——5 自动化业务工作流——0 用例 (Use case)
  • 五、RuoYi-Cloud-Plus 前端项目部署以及如何改后端请求地址。
  • 线上排查问题的一般流程是怎么样的?
  • 集成电路学习:什么是RQT图形用户界面工具
  • 搭建商城的关键注意事项:从定位到运营的全链路指南
  • 基于 InfluxDB 的服务器性能监控系统实战(二)
  • 深入解析进程创建与终止机制
  • Linux 信号处理标志sa_flags详解
  • 有限元方法中的数值技术:Cholesky矩阵分解
  • 从零学习three.js官方文档(一)——基本篇
  • 校招秋招春招实习快手在线测评快手测评题库|测评解析和攻略|题库分享
  • 【linux基础】Linux目录和Windows目录的区别
  • 免费开发数字人API
  • Milvus 向量数据库基础操作解析
  • Kubernetes 无法识别你定义的 `CronJob` 资源*逐步解决方案
  • 不足3个细胞怎么做差异分析?
  • 目标检测数据集 - 足球场广告横幅检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 【Datawhale AI夏令营】从Baseline到SOTA:深度剖析金融问答RAG管道优化之路
  • [CUDA] CUTLASS | `CuTe DSL` 创新
  • 《TypeScript搭建的认知桥梁:游戏化学习应用的深层架构》
  • day22|学习前端ts语言
  • Javaweb - 14.1 - 前端工程化
  • 政府数字化大屏系统 - Flask实现方案
  • 使用LangGraph从零构建多智能体AI系统:实现智能协作的完整指南
  • OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响
  • HTML金色流星雨
  • 人工智能技术发展历史演变
  • Android中RecyclerView基本使用
  • 深入理解Qt事件处理机制