循环操作数据库

那个阳光刺眼的周一,我坐在崭新的工位上手心有点出汗,这是我入职的第一天,我想给所有人留个好印象,组长走过来拍了拍我的肩膀,递给我一张任务单,他的语气很轻松,说小赵啊这个任务很简单,就是查一下用户列表然后把部门和角色信息补全,我一听心里乐开了花,这种增删改查的活儿我在学校里闭着眼睛都能搞定,我拍着胸脯说组长放心保证半小时内交货。

我回到座位打开电脑新建了一个Java类,我的手指在键盘上飞舞,很快我就写好了代码,我先调用userMapper的selectAll方法拿到了一个用户列表,然后我写了一个漂亮的for循环,在循环里我优雅地写下了两行查询,一行是deptMapper.selectById(user.getDeptId()),另一行是roleMapper.selectByUserId(user.getId()),我觉得自己聪明极了,这样代码多清晰啊,一看就明白每个用户是怎么补全数据的,我甚至还用了lambda表达式让代码看起来更现代,我美滋滋地运行了单元测试,测试数据只有五十条用户,唰一下就跑完了,全部通过,我得意地靠在椅背上,觉得自己真是个编程天才。

我兴冲冲地去找组长验收,组长当时正在和架构师讨论着什么分布式事务,他转过身来看我的代码,刚开始表情还挺温和,但当他看到那个for循环时,他的眉头慢慢皱了起来,就像看见了什么不该存在的东西,他的眼睛越瞪越大,嘴唇开始微微发抖,他扶了扶眼镜把脸凑近屏幕,仿佛不敢相信自己看到了什么,然后他深吸了一口气,那吸气的声音很长很长,长得让我开始不安。

你知道你在做什么吗,组长的声音听起来很平静,但那种平静底下好像压着一座火山,我点点头说知道啊,不就是补全用户信息吗,组长的手指开始敲击桌面,嗒,嗒,嗒,每一声都敲在我的心跳上,他突然提高了音量,你知道每一次数据库查询要经历什么吗,从应用程序到数据库驱动再到网络传输,经过TCP/IP协议栈,到达数据库服务器,数据库要解析SQL语句,生成执行计划,检查缓存,可能还要走索引,然后从磁盘读取数据,再通过网络传回来,每一次查询都是一次完整的旅程,而你,你在一个循环里发起这种旅行,一次,两次,五十次。

他的语速越来越快,你知道连接池吗,每个数据库连接都是珍贵的资源,就像高速公路上的车道,你一个人就占了五十条车道,其他车怎么办,紧急的支付请求怎么办,库存扣减怎么办,订单状态更新怎么办,它们全都被你堵在后面排队,你知道排队意味着什么吗,意味着超时,意味着失败,意味着用户支付成功了却看不到订单,意味着客服电话被打爆,意味着运营人员要加班写道歉信,意味着公司可能要赔钱。

而且这还只是五十个用户,组长的声音已经开始发抖了,如果是五千个用户呢,五万个用户呢,你打算发起五万次独立的查询吗,数据库服务器会怎么想,它会觉得受到了攻击,DDoS攻击,连接数瞬间爆满,CPU飙到百分之百,内存溢出,线程池耗尽,然后,砰,整个数据库宕机,所有线上服务全部停摆,用户打不开页面,商家无法管理商品,骑手接不到订单,公司每分钟损失的钱够给你发十年工资。

你以为这就结束了吗,组长冷笑着,数据库宕机会触发监控报警,凌晨三点运维兄弟的手机开始狂响,他不得不从床上爬起来,睡眼惺忪地打开电脑,一边骂娘一边尝试重启数据库,重启之后发现主从同步断了,又要手动修复数据,折腾到天亮才勉强恢复,而这一切的根源,就是你写的这个看似无害的for循环,就因为这几行代码,一个团队彻夜未眠,公司损失了真金白银,而你还在梦里流口水。

我的脸开始发烫,汗水顺着后背往下流,办公室安静得可怕,我能听见自己的心跳声,砰,砰,砰,周围的同事都停下了手里的工作,有人偷偷往这边看,有人假装在喝水但耳朵竖得老高,对面那个资深架构师摇了摇头,发出一声轻轻的叹息,那叹息比骂我还让我难受。

组长终于停了下来,他靠在椅子上看着天花板,好像在努力平复情绪,过了好一会儿他才重新开口,声音疲惫了很多,你知道该怎么写吗,我摇摇头,他说你应该用关联查询,一次把用户部门角色全部查出来,或者先批量查询部门数据再批量查询角色数据,然后用Map做映射关系,在内存里做数据组装,这样无论有多少用户,你都只需要两到三次数据库交互,而不是N次,这才是程序员该有的思维,要有全局观,要考虑到性能,考虑到扩展性,考虑到你写的每一行代码都可能运行在生产环境,服务着成千上万的用户。

他把我的代码全部删掉,新建了一个文件,手指在键盘上敲出清脆的响声,他写了一个包含join的SQL语句,又写了一个批量查询的方法,然后用了Java8的Stream和Collectors.groupingBy,短短二十行代码,优雅得像一首诗,性能比我那个版本快了一百倍都不止,我看呆了,原来代码可以写得这么美。

那天下午我坐在工位上发呆,脑子里全是组长说的那些话,连接池,网络IO,数据库负载,生产事故,我第一次意识到编程不是只要功能实现就行,每一行代码都有重量,都可能产生蝴蝶效应,从那天起我再也没在循环里写过数据库查询,每次写代码前我都会问自己,这样写会不会有性能问题,有没有更好的方法,那个挨骂的下午成了我职业生涯中最重要的一课,虽然当时难堪得想找个地缝钻进去,但现在回想起来,我真心感谢组长那顿劈头盖脸的教训,他骂醒了一个只会写功能的新手,培养出了一个开始思考性能的程序员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1120084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas 数据处理

数据处理基础概念数据处理的定义与重要性Pandas在数据处理中的核心作用常见数据结构:Series与DataFrame数据导入与导出支持的文件格式(CSV、Excel、JSON等)使用read_csv()、read_excel()等函数加载数据数据导出方法:to_csv()、to_…

日志输出优化实战:从“能用”到“好用”的全攻略

日志输出优化实战:从“能用”到“好用”的全攻略在日常开发中,日志是开发者的“眼睛”——排查问题、定位故障、监控系统状态,都离不开日志。但实际项目里,很多日志输出却处于“能用但不好用”的状态:要么级别混乱&…

Unity3d之修改子物体的层级关系

修改子物体的层级的1.go.transform.SetAsFirstSibling(); 放到最上面2.go.transform.SetAsLastSibling(); 放大最下面3.go.transform.SetSiblingIndex(count); 根据物体下标修改count0;为最上面的count-1;为最下面的再补充一句解除父子关系的代码也有可能…

全面解析 Agent Engineering 的 10 大工程维度:生产级 Agent 系统的炼成之路

2026新年快乐 HAPPY NEW YEAR 技术层面的突破让AI智能体(Agent)成为当前绝对的AI热点。但随着Agent应用走向真实业务,也逐渐暴露出其工程瓶颈:不确定性、幻觉、不可观测、性能、安全、成本等多方面存在挑战…这些问题不会因为模型…

如何高效安全地管理多个社媒账号?

您是否常常为多社交账号的管理难题所困扰?市面上已有的管理工具固然提供了一定便利,但也并非无所不能。假设某社交平台规定每台设备最多同时登录2个账号,那么即便使用账号管理工具,您也只能在这台设备上管理2个账号。若您需要管理…

AI产品经理全景图:从NLP/CV到金融医疗,9大岗位类型详解与跃迁路径

文章从技术方向、业务场景和业务阶段三个维度解析AI产品经理九大类型:技术深耕型(NLP/CV/推荐)、垂直领域型(行业解决方案/通用工具)和全生命周期型(0-1孵化/增长型/平台型)。无论哪种类型,AI产品经理都需具备技术理解、业务转化和跨团队协作三大核心能力…

计算机视觉在零售行业的AI原生应用探索

计算机视觉在零售行业的AI原生应用探索 关键词:计算机视觉、零售行业、AI原生、智能货架、消费者行为分析、无人零售、多模态融合 摘要:本文以"AI原生"为核心视角,深入探讨计算机视觉技术如何从底层设计重构零售行业的人货场关系。…

主机安全功能:主机的风险与监测

检测多项主机安全信息,实现对主机全方位保护,包含账户检测、文件检测、网络检测等重点安全信息,对各安全元素多点全方位实现防御把控,将现有安全策略下沉到防护主机当中。如病毒、木马、勒索软件及恶意攻击,系统通过先…

2025年AI产品经理生存指南:为什么现在学AI反而更简单?值得收藏

文章指出AI产品经理已成为新物种,与传统产品经理有根本变化。尽管30%产品经理选择躺平不学AI,但AI学习正变得简单:模型榜单已固定,模型管理平台降低研发成本,各领域已有头部AI产品代表。AI产品经理只需关注特定领域模型…

基于DWA的动态环境下无人机自主避障路径优化附MATLAB代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

nodejs v24.12.0+Express 5.0 迁移升级

2025年过去了,2026新年伊始,翻了一下过去一年写的代码,使用nodejs也快10年了,最新的nodejs版本已经发展到了v25,使用dp分析对比,推荐升级到v24版本,由此带来了系统升级,代码调整。 原系统: node v18.19.1 + Express 4 升级:nodej v24.12.0 + Express 5 一、安装no…

环境仿真软件:SWAT_(7).SWAT在非点源污染模拟中的应用

SWAT在非点源污染模拟中的应用 1. 非点源污染的定义与特点 非点源污染(Non-Point Source Pollution, NPS)是指没有明确排放口或点源的污染,其来源广泛,包括农业活动、城市径流、大气沉降等。与点源污染(Point Source P…

【时变频率估计】基于扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)对窄带信号的时变频率估计,评估两种滤波算法在动态信号跟踪任务中的性能附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

Qwen3VL开源图文多模态大模型

原文出处: https://zhuanlan.zhihu.com/p/1978593520458696605 Qwen3-VL 系列包含以下变体: Dense 模型: Qwen3-VL-2B, 4B, 8B, 32B。 MoE 模型: Qwen3-VL-30B-A3B (Active 3B), Qwen3-VL-235B-A22B (Total 235B, Active 22B)。 …

2026大模型高薪攻略:小白到年薪百万的黄金入行指南_2026年AI大模型领域薪资爆发,抓住五大热门岗位

文章解析2025年AI大模型高薪机遇,指出算法工程师月薪7万、科学家11万。详细介绍五大岗位技能要求、涨薪策略及避坑指南,强调现在是入行黄金期,错过将错失百万年薪机遇。2025年AI大模型领域迎来爆发期,算法工程师月薪7万&#xff0…

Python实现功能完整的扫雷小游戏

一、游戏功能亮点本次实现的扫雷游戏在基础玩法之上,新增了三大核心功能,提升游戏体验与挑战性:计时器功能:游戏启动后自动计时,结束时显示通关或失败用时,增强竞技感;难度选择功能:…

langchain的中文文档地址

中文文档地址:https://www.langchain.com.cn/docs/introduction/

一分钟读懂代付业务

代付业务主要分为个人代付与企业代付两大类型。对于企业而言,开通代付功能堪称降本增效的利器,核心优势有四:1. 724小时全天候服务:支持自动抵扣转账,不受节假日、上下班时间限制,资金流转更灵活。2. 解放财…

飞越中国沉浸式体验馆:7D互动影院引领全新娱乐风潮

飞越中国沉浸式体验馆的创新娱乐体验 在飞越中国沉浸式体验馆中,7D互动影院成为众多观众探寻新娱乐体验的首选。该影院利用先进技术,为观众提供超高清画质并结合动感座椅,创造出独特的沉浸感。在这里,观众不仅仅是被动观看&#x…

高考学校和专业的选择

高考学校和专业的选择是:专业占比:40%学校占比:30%地域占比:30%学校占比,国内就是按这个顺序,清北、C9、985、211、其它有一定名气的一二本、普通二本、末流二本原三本、大专。这儿值得一提的是&#xff0c…