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

记一次奇异的bug

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

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

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

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

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

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

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

http://www.xdnf.cn/news/1270675.html

相关文章:

  • n8n 入门指南:更适合跨境出海搞钱的AI智能体
  • 基于 InfluxDB 的服务器性能监控系统实战(一)
  • vue3上传的文件在线查看
  • 【linux基础】Linux命令提示符解析与操作指南
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 Azure Data Studio
  • 编译技术的两条演化支线:从前端 UI 框架到底层编译器的智能测试
  • “自动报社保 + 查询导出 ” 的完整架构图和 Playwright C# 项目初始化模板
  • 基于IPD体系的研发项目范围管理
  • 【渲染流水线】[几何阶段]-[几何着色]以UnityURP为例
  • 202506 电子学会青少年等级考试机器人三级器人理论真题
  • 《算法导论》第 15 章 - 动态规划
  • FreeRTOS源码分析五:资源访问控制(一)
  • SOLi-LABS Page-3 (Stacked injections) --39-53关
  • OpenAI 的最新 AI 模型 GPT-5 现已在 GitHub Models 上提供!
  • 如何在 Windows 下使用 WSL 安装 Ubuntu 并配置国内镜像
  • 神经网络-local minima and saddle point
  • FFMPEG将H264转HEVC时,码率缩小多少好,以及如何通过SSIM(Structural Similarity Index结构相似性指数)衡量转码损失
  • 使用Navicat备份数据库MySQL、PostGreSQL等
  • Meta AI水印计划的致命缺陷——IEEE Spectrum深度文献精读
  • (nice!!!)(LeetCode 面试经典 150 题) 146. LRU 缓存 (哈希表+双向链表)
  • 力扣热题100------70.爬楼梯
  • 如何解决 Vue 项目启动时出现的 “No such module: http_parser” 错误问题
  • Cherryusb UAC例程对接STM32内置ADC和DAC播放音乐和录音(中)=>UAC+STM32 ADC+DAC实现录音和播放
  • traceroute命令调试网络
  • C++高频知识点(十七)
  • 《Resolving tissue complexity by multimodal spatial omics modeling with MISO》
  • 9. 堆和栈有什么区别
  • Vitalik谈以太坊:ETH财库储备策略“有益且有价值”
  • Kotlin 协程线程切换机制详解
  • AG32cpld实现一个UartTx“外设”