- 博客(1675)
- 资源 (33)
- 收藏
- 关注
原创 Service层 vs. Repository层:你的过滤逻辑放对位置了吗?
本文探讨了分层架构中业务逻辑的放置问题,以"过滤产品分类"为例对比了两种实现方案。方案一将过滤逻辑放在Repository层,虽性能稍优但导致代码复用性差、职责不清;方案二在Service层进行过滤,保持了Repository的通用性,使业务逻辑更灵活、可维护性更高。文章通过代码示例和图表分析,论证了Service层过滤的优势,最终建议让Repository层保持纯粹的数据访问职责,而将易变的业务规则放在Service层处理,以实现更好的代码复用和可维护性。
2025-09-04 14:38:52
883
原创 Spring Data JPA 分页排序进化论:从单字段到 toPageableWithMultiSort 的优雅之道
本文分享了Spring Data JPA分页排序功能的演进过程,从最初仅支持单字段排序的简单实现,逐步重构为支持复杂多字段组合排序的通用解决方案。通过对比toPageableWithDefault和toPageableWithMultiSort两个版本,展示了如何利用Sort.Order对象封装独立排序规则,实现如"先按序号降序NULLS LAST,再按创建时间降序"等复杂业务需求。最终方案具有高度可复用性,使Service层代码更加清晰直观,同时体现了领域对象设计和关注点分离等优秀实践
2025-09-02 20:59:17
1210
原创 JPA删除操作的“终极形态”:如何用@Modifying与EXISTS子查询构建一个“刀无虚发”的API
摘要:本文探讨了如何通过JPA的@Modifying注解和EXISTS子查询构建高效安全的删除接口。传统"先查后删"方式存在性能浪费和安全风险,而优化方案将权限校验与删除操作合并为原子性数据库命令,仅需一次交互即可完成。关键点在于:1)使用@Modifying声明修改操作;2)在DELETE语句中嵌入EXISTS子查询实现权限校验;3)Service层只需检查影响行数。相比传统方案,该方案减少50%数据库交互,同时提升安全性和性能,是JPA删除操作的最佳实践。
2025-09-02 20:41:59
1033
原创 Vue $nextTick 探秘:为何我的图片上传组件“拒绝”回显?
Vue $nextTick 解决图片上传组件数据回显问题 摘要:本文通过图片上传组件无法回显数据的案例,揭示了 Vue 异步更新机制导致的时序问题。当父组件连续修改数据时,Vue 会合并同 Tick 的更新,导致子组件错过关键状态变化。解决方案是使用 $nextTick 将第二次数据更新延迟到 DOM 重置完成后执行,确保子组件能正确响应。文章详细分析了问题根源,并展示了修复代码,帮助开发者理解 Vue 更新队列的工作原理。这个案例说明,在需要确保 DOM 更新完成后再操作的场景下,$nextTick 是解
2025-09-02 19:33:03
797
原创 架构的减法:为何“文件上传分离”是构建优雅创建接口的关键?
摘要:本文探讨了在Web应用中,通过“文件上传分离”架构优化创建接口的设计。针对带图片上传的福利方案创建场景,传统混合接口存在职责混乱、复用性差等问题。作者提出“两步走”解耦方案:1)通用文件上传接口仅处理文件并返回路径;2)纯业务接口接收JSON数据(含文件路径)进行创建。该方案实现职责单一、高复用性、低耦合等优势,同时提升前端体验。通过SQL日志验证了其高效性,并附架构对比表和流程图,阐明分离设计如何让各组件更专注强大。
2025-09-02 18:44:02
1084
原创 JPA中的“克隆”艺术:如何为一个“复制方案”接口实现高效的深度复制
JPA深度复制接口设计摘要: 本文详细解析了如何高效实现JPA中的"深度复制"功能,通过结合JOIN FETCH和JPA级联保存特性,构建高性能的模板克隆API。核心方案采用"先读全后写全"策略:首先使用JOIN FETCH一次性加载模板及其所有子项,避免N+1查询;然后在Java内存中构建新对象图;最后利用CascadeType.ALL实现一键级联保存。文章通过具体业务场景(小程序方案模板复制)展示了这种设计模式的优势,包括高性能、代码简洁和事务安全性。技术要点包含
2025-09-01 20:04:58
1186
原创 Spring Boot 启动失败?解密 Address already in use 的“幕后真凶”
Spring Boot启动失败:Address already in use问题排查指南 当Spring Boot应用启动失败并提示Address already in use,通常是由于端口被占用。本文通过分析典型错误日志,揭示了问题的根源——旧应用进程未完全退出。解决方案包括: 对于macOS/Linux: 使用lsof -i :端口号查找占用进程的PID 执行kill -9 PID强制终止进程 对于Windows: 运行netstat -ano | findstr :端口号定位PID 执行taskki
2025-09-01 19:05:59
884
原创 Vue 组件通信揭秘:子组件是如何“悄悄话”告诉父组件的?
Vue组件通信:子组件如何向父组件传递数据? 在Vue应用中,子组件通过$emit方法向父组件传递数据,实现组件间通信。 子组件发射事件:子组件使用this.$emit('事件名', 数据)触发自定义事件,并携带数据(如价格信息)。 父组件监听事件:父组件在模板中通过@事件名="处理方法"监听子组件的事件。 父组件接收数据:父组件的处理方法会接收到子组件传递的数据,并更新自身状态,触发视图响应式更新。 核心机制: Props(父传子) ⬇️:单向数据流 $emit(子传父) ⬆️:事件触
2025-09-01 17:11:33
813
原创 JPA更新接口的“双重奏”:当@DynamicUpdate遇上聚合查询
摘要: 本文探讨了如何设计高效更新并返回复杂计算结果的API,结合JPA的@DynamicUpdate和聚合查询优化读写性能。 业务需求:管理员修改福利方案后,需高效保存并实时返回含总金额的更新结果。 优化策略: 写优化:通过@DynamicUpdate实现仅更新修改字段,避免全量SQL。 读优化:用聚合查询直接从数据库计算总金额,减少内存开销。 实现效果:Service层分离读写操作,生成精准的UPDATE语句和轻量级聚合查询,日志验证了“加载→计算→更新”的高效流程。 结论:读写分离策略(@Dynami
2025-09-01 16:32:57
869
原创 JPA详情页查询的“庖丁解牛”:一次“两步查询”搞定聚合、列表与计算
本文介绍了一种高效构建复杂详情页API的“两步查询法”,结合JPA DTO投影技术。该方法将查询分解为:1)获取主实体信息作为框架;2)通过DTO投影精准查询子列表数据,避免N+1问题;3)在内存中完成数据转换和聚合计算。这种模式通过2次固定查询即可完成跨表数据聚合,既保证了性能最优(数据库计算+内存处理),又实现了代码清晰健壮。文章以小程序方案详情页为例,展示了如何同时获取主信息、子列表和动态统计值,为复杂数据聚合提供了标准化解决方案。
2025-08-31 18:14:54
1074
原创 JPA“两步查询法”:如何优雅应对聚合与“分组Top N”的双重挑战
摘要:JPA“两步查询法”应对聚合与分组Top N挑战 在后端开发中,构建信息丰富的列表页API常面临聚合计算与关联预览的双重挑战。文章通过GET /api/app/solutions/seasonal-hot接口案例,提出"两步查询法"解决方案: 主查询:在数据库层面完成分页、核心过滤和聚合计算,利用JPQL实现高效查询; 子查询:通过关联子查询模拟窗口函数,在MySQL 5.6限制下实现分组Top N查询; Service层:将两个查询结果在内存中优雅组合成最终视图对象。 该方法证明
2025-08-31 13:05:11
639
原创 JPA JOIN FETCH的威力:如何为一个“详情页”接口根除N+1“幽灵”
本文通过一个详情页接口案例,展示了如何利用JPA的JOIN FETCH解决@ManyToMany懒加载导致的N+1查询问题。默认的懒加载方案会触发2次数据库查询(主表1次+关联表1次),而使用JOIN FETCH后只需1次查询即可获取主表和关联表的全部数据。优化后的方案不仅消除了N+1风险,还保持了代码简洁性,是详情页查询场景的最佳实践。关键点在于:在Repository层使用LEFT JOIN FETCH预加载关联集合,避免访问时触发额外查询。
2025-08-29 20:35:27
1041
原创 JPA JOIN FETCH的权衡艺术:从N+1到“精准更新”的完整优化之路
JPA优化实践:巧用JOIN FETCH和@DynamicUpdate解决N+1与过度更新问题 本文通过一个修改需求单的业务场景,展示了如何通过JPA注解组合优化性能。首先使用JOIN FETCH预加载关联数据解决N+1查询问题,但发现会引发全字段更新的性能损耗。继而引入@DynamicUpdate注解,实现仅更新修改字段的精准操作。最终形成"JOIN FETCH解决读取性能+@DynamicUpdate优化写入效率"的黄金组合方案。文章通过SQL日志对比验证了优化效果,并总结出各策略的
2025-08-29 19:58:28
989
原创 input 文字居中?text-align: center; 就够了吗?
本文系统探讨了如何实现 <input> 输入框文字的居中显示,提供了三种解决方案:1)使用 text-align: center 实现水平居中;2)结合 height 和 line-height 实现垂直居中;3)采用 Flexbox 布局应对复杂场景。文章通过代码示例和原理分析,详细比较了各方案的优缺点,并附上决策流程图和时序图,帮助开发者根据不同需求选择最佳实现方式。核心结论是:简单水平居中用 text-align,固定高度时用 line-height,复杂布局推荐 Flexbox。
2025-08-29 17:11:56
676
原创 API设计的“临门一脚”:为什么你的创建和列表接口都必须返回ID?
API设计的关键细节:ID的重要性 在API开发中,资源唯一标识符(ID)的缺失会导致前端体验断裂。通过两个典型场景分析: 创建接口无ID:前端无法直接跳转详情页,被迫二次查询或放弃跳转 列表接口无ID:交互受阻,无法精准定位资源 解决方案:在VO中统一返回ID字段,使API响应自给自足。这一简单改动带来: 流畅的创建-跳转流程 可靠的列表-详情交互 符合RESTful设计原则 核心启示:ID是资源的"数字身份证",任何资源响应都应包含ID,这是API设计的"临门一脚"
2025-08-29 14:50:33
964
原创 JPA性能铁三角:DTO投影、分页与安全校验的完美融合
摘要:JPA性能优化的三大核心技巧 本文通过一个移动端需求列表接口的开发案例,系统阐述了JPA性能优化的三大核心技巧:DTO投影、高效分页和轻量级安全校验。这些技巧共同构成了"性能铁三角",完美解决了响应速度、数据准确性和代码可维护性之间的矛盾。 文章详细展示了如何通过构造器投影(SELECT new)精准获取所需字段,利用Pageable和countQuery实现高效分页,以及使用existsById进行前置安全检查。最终实现的接口只产生三次轻量级数据库交互,既保证了性能又确保了安全性
2025-08-28 21:16:52
996
原创 JPA SELECT new的“隐形契约”:@AllArgsConstructor为何是构造器投影的关键?
JPA的SELECT new构造器投影需要DTO类提供匹配的全参构造函数,否则会报错"无法解析构造函数"。通过添加Lombok的@AllArgsConstructor注解,可以自动生成所需的全参构造函数,完美解决这一问题。该方案既保证了JPA查询的高效性,又简化了代码维护,是DTO投影查询的最佳实践。
2025-08-28 21:08:24
585
原创 架构之美:为小程序打造一个“零读取”的JPA创建接口
摘要:小程序高性能JPA接口设计实践 本文介绍了一种为小程序端设计高性能JPA创建接口的架构方案。通过创建专属的AppSolutionDemandService,实现了与PC端逻辑的清晰分离。采用existsById进行轻量级校验,结合getReference方法建立关联关系,最终仅产生1次计数查询和1次插入操作,达到近乎"零读取"的性能优化效果。这种架构设计既保证了安全性(使用Token解析用户ID),又通过后端填充业务字段确保数据一致性,展示了职责分离与性能优化的完美结合。
2025-08-28 18:38:16
1028
原创 防御性编程的艺术:修复 Vue“幽灵 Bug”后的深度复盘
Vue 组件数据传递的防御性编程实践 本文通过一个父子组件数据传递的"幽灵 Bug"案例,探讨了两种修复策略背后的编程哲学。作者发现仅修复子组件的 created 钩子也能解决问题,但深入分析了同时使用 $nextTick 的价值:方案A(只修复子组件)实现了基本功能,而方案B(双重修复)则通过规范父组件时序和强化子组件容错性,构建了更健壮的代码结构。文章强调防御性编程的重要性,建议在团队协作中采用方案B,既解决当前问题,又为未来维护预留安全边际,体现了从"足够好"到
2025-08-28 16:38:21
877
原创 时序图中一行 end 引发的血案:当 AI 和我都陷入 Mermaid 语法泥潭
《一行end引发的Mermaid语法血案》讲述了一个技术调试的典型困境。作者在绘制Mermaid序列图时,因遗漏一个end闭合标签导致数小时无效调试,陷入复杂的错误分析,最终发现是简单语法错误。文章通过这个案例总结了重要教训:调试应先检查基础语法而非复杂理论;需要最小化问题定位错误;正确解读错误提示;保持开放心态接受反馈。这个"低级错误导致高级困扰"的故事,生动展现了技术工作中保持基础扎实和思维清晰的重要性。
2025-08-28 16:35:43
884
原创 一次“刷新后幽灵 Bug”的破案之旅:深入 Vue 异步渲染时序问题
摘要 本文分享了作者排查Vue异步渲染时序问题的经历。现象表现为:刷新页面后首次打开对话框时,图片上传组件无法显示已有图片,但再次打开则正常。通过分析三层嵌套组件结构,发现根源在于父子组件的时序问题:子组件初始化不及时(初始值设为空字符串且未主动同步prop),父组件未等待Vue异步更新完成就立即渲染对话框。解决方案采用"双管齐下":子组件在created钩子主动初始化数据,父组件使用$nextTick确保DOM更新后再显示对话框。文章深入剖析了Vue的异步渲染机制,并对比了不同解决方案
2025-08-28 15:56:51
1144
原创 代码复用的“陷阱”:一次N+1优化如何“阉割”了我的创建接口
代码复用的陷阱:一次N+1优化引发的功能缺陷 文章讲述了一个由代码复用引发的性能优化与功能缺陷案例。开发者最初使用通用的convertToVO方法处理实体转换,虽然功能完整但导致列表接口出现N+1查询问题。为解决性能问题,优化后的版本移除了分类集合处理逻辑,却意外导致创建接口无法返回分类名称。最终通过职责分离方案,将转换逻辑拆分为convertDemandEntityToVOForList和convertDemandEntityToVOForDetail两个专用方法,既解决了性能问题又保证了功能完整性。 核
2025-08-27 18:40:41
784
原创 JPA性能的“乐高”艺术:如何在已优化的列表接口上“无痛”叠加@ManyToMany查询
摘要:文章探讨了如何在已优化的JPA列表接口上优雅叠加@ManyToMany关联查询,避免N+1性能问题。通过一个需求单列表接口的演进案例,展示了从"两步查询"到"三步查询"的扩展过程:1)保持原有的分页主查询和方案ID批量查询;2)新增分类名称的批量查询;3)内存组装VO。该方法通过固定次数的批量查询(3次SQL)确保了性能,同时保持架构的可扩展性,体现了"分而治之"的设计思想,使系统能够灵活应对需求变化而无需重构。
2025-08-27 18:07:09
1018
原创 JPA的“隐形”INSERT:解密save()方法如何自动处理多对多中间表
本文介绍了如何在已有的创建接口上优雅地增加一个复杂的多对多关联功能。通过扩展Payload、批量安全校验和JPA自动关联的"三板斧"方案,实现了创建需求单时关联多个分类标签的功能。重点包括:1)使用Set接收分类ID列表;2)通过批量IN查询高效校验ID合法性和所有权;3)利用JPA的@ManyToMany注解自动处理中间表操作。该方案确保了数据安全,避免了N+1查询问题,同时保持了代码简洁性,展示了JPA处理多对多关系的最佳实践。
2025-08-27 17:50:58
554
原创 JPA vs. MyBatis:一场关于“多对多”关联的“自动化”与“掌控权”之战
本文通过“需求单关联分类”场景对比JPA和MyBatis的设计哲学与实现差异。JPA采用全自动ORM方式,通过@ManyToMany注解自动处理多对多关系,开发者只需操作Java对象,代码简洁但失去SQL控制权。MyBatis作为SQL Mapper则要求手动编写所有SQL,包括中间表操作,虽然开发效率较低但能精准控制SQL执行。二者各有所长:JPA适合追求开发效率的场景,MyBatis则适合需要SQL优化的项目。
2025-08-27 17:16:45
1008
原创 不止于默认:揭秘 Spring Boot 中基于 Guava 的自定义内存缓存设计
本文介绍了在Spring Boot中基于Guava实现自定义内存缓存的设计方案。通过分析默认缓存的三大局限性(无过期时间、无限容量、缺乏灵活性),作者提出了一个由MyConcurrentMapCacheManager(缓存引擎)、MyCache(配置器)和CacheChecker(诊断工具)组成的解决方案。核心亮点包括:1)集成Guava的CacheBuilder实现过期和容量控制;2)通过命名约定(如findAdminById#3600)实现动态TTL配置。该方案相比默认缓存更强大,相比Redis更轻量,
2025-08-27 16:22:13
745
原创 不只是查询:如何用“初始化检查”打造一个“自愈式”的JPA数据源接口
摘要:构建“自愈式”JPA查询接口的设计实践 本文介绍了一种创新的查询接口设计模式,通过在查询前加入幂等的初始化检查逻辑,使接口具备自动修复基础数据的能力。以多租户系统中的分类下拉框接口为例,详细解析了如何通过CategoryInitializationService实现数据状态的自动校准,确保无论数据库处于何种状态(新用户注册、数据误删或系统升级),接口都能返回完整可靠的数据。这种"检查先行,查询在后"的设计模式不仅提高了系统健壮性,还显著降低了维护成本。文章包含核心代码实现、SQL日
2025-08-27 15:56:42
726
原创 从3次查询到2次:一次@Cacheable注解引发的“静默”性能革命
摘要:通过引入@Cacheable注解的缓存服务层,优化了listDemandCategories接口的性能。原实现每次调用需3次数据库查询,其中获取管理员信息的查询是冗余的。优化后,首次调用仍为3次查询,后续调用利用缓存将查询降至2次,显著减少I/O开销。这种声明式缓存方案以最小代码改动实现了"静默"性能提升,适用于不常变更的基础数据场景,体现了分层架构的优势。
2025-08-27 15:31:53
1119
原创 从 JPQL 到动态 Specification:一个高性能小程序接口的进化之路
摘要: 本文记录了一个Spring Data JPA接口从简单JPQL查询进化为高性能动态查询的完整过程。最初采用JPQL DTO投影实现基础功能,后通过Specification支持动态过滤。在优化过程中,发现重复JOIN的性能问题,最终通过"先fetch后get"策略复用关联,生成高效SQL。这一案例展示了如何在JPA中平衡灵活性与性能,为解决动态查询中的N+1和重复连接问题提供了最佳实践。
2025-08-26 20:30:26
743
原创 “父相子绝”:CSS 布局中你必须掌握的“黄金法则” ✨
“父相子绝”:CSS布局的核心法则 这句口诀揭示了CSS定位的精髓:父元素设置position:relative创建定位上下文,子元素设置position:absolute相对于父元素定位。通过这种组合,可以实现图片角标、悬浮按钮等精准布局效果。relative的妙处在于不破坏文档流,而absolute则脱离文档流进行精确定位。理解这一原理,能轻松应对各种叠加元素的布局需求,是前端开发者必须掌握的黄金法则。图表和示例直观展示了其工作机制与应用场景。
2025-08-26 16:02:02
701
原创 CSS 定位揭秘:我的 position: absolute 到底相对谁?
CSS 定位机制解析 本文深入剖析了CSS中position: absolute的定位原理,通过生动的气球比喻解释了其参照系确定规则。关键点包括: 定位规则:绝对定位元素会向上查找第一个非static定位的祖先元素作为参照物 两种典型情况: 无合适祖先时相对视口定位 有relative祖先时相对该容器定位 最佳实践:推荐使用"父相子绝"(父级relative+子级absolute)组合,既能建立定位上下文又不会干扰正常文档流 文章通过代码示例、对比表格和流程图,系统化地呈现了这一CSS核
2025-08-26 15:15:38
804
原创 JPA性能的“乐高”艺术:如何在已优化的列表接口上“无痛”叠加聚合计算
摘要 本文通过一个实际案例,展示了如何在已优化的JPA列表接口上优雅叠加聚合计算功能。原接口采用"三步查询法"高效获取方案列表及关联数据,当需要新增价格聚合计算时,作者通过增加"第四步"批量查询实现功能扩展,而非重构原有代码。这种"乐高积木式"的架构设计保留了原有性能优势,通过新增Repository方法批量计算价格,并保持固定的4次数据库查询。文章验证了"N步查询法"的可扩展性,既能满足新需求,又确保性能不退化,体现了良好的架
2025-08-25 17:20:23
658
原创 从 utils 到 template:一个 Vue 组件调用外部工具函数的最佳实践(import { formatPrice } from ‘@/utils/format‘)
在 Vue 组件中优雅调用外部工具函数需遵循三个关键步骤:首先通过 import 导入函数(如 formatPrice),然后在组件实例上注册该函数(private formatPrice = formatPrice),最后在模板中直接调用。这种模式既保持了代码的模块化,又确保了模板的可访问性,是 Vue 开发中复用工具函数的最佳实践。文章通过价格格式化函数的具体案例,详细解析了从工具模块到组件调用的完整链路,并强调了作用域转换的关键原理。
2025-08-25 17:03:50
1070
原创 告别 Swagger 配置烦恼:为什么“扫描根包”是你的最佳选择?
摘要:Swagger 配置的最佳实践 本文通过一个真实的调试案例,揭示了 Spring Boot 项目中 Swagger 配置的常见陷阱。当项目结构复杂时,精确指定多个 Controller 包路径会导致版本兼容性和语法复杂性问题。最终解决方案是采用"扫描根包"策略:直接配置 basePackage("com.your.root")。这种方法具有简单性、面向未来和版本无关性等优势,能自动发现所有子包中的 Controller,实现"一次配置,终身有效&quo
2025-08-25 16:09:37
663
原创 从 “No tools or prompts” 到 “2 tools enabled”:一次 Cursor Figma MCP 的深度调试之旅
摘要 本文记录了在配置 Cursor 编辑器的 Figma MCP 功能时遇到的 "No tools or prompts" 错误及其解决过程。通过手动执行 npx figma-developer-mcp 命令,发现 Node.js 版本过低(v16.20.2)导致依赖库 sharp 无法加载。使用 NVM 升级至兼容版本(v22.17.1)后,MCP 成功启动。最终重启 Cursor,绿灯亮起,显示 "2 tools enabled"。 关键点: 理解工作原理:MC
2025-08-23 18:24:16
1075
原创 一次“最近使用”功能引发的JPA深度实践:从状态写入到智能查询
摘要: 本文以“最近使用”功能为例,探讨了后端架构的演进过程。通过改造addItemToSolution接口,从轻量校验升级为加载实体并记录lastUsedDate,实现了状态写入的优化。随后,在listSolutionNameIdPairsForApp接口中,通过数据库排序与Java逻辑判断的结合,智能呈现“最近使用”状态。文章展示了JPA在性能权衡、数据加载策略和职责分离方面的深度实践,体现了业务需求驱动下的技术演进。(149字)
2025-08-23 17:32:43
821
原创 JPA启动时“崩溃”之谜:SELECT new中子查询引发的Unexpected AST血案
JPA启动时因SELECT new中子查询导致Unexpected AST错误的分析与解决方案。文章指出,在JPQL构造器表达式中嵌入复杂逻辑和子查询会超出Hibernate解析器的处理能力,引发启动失败。作者通过创建临时DTO简化Repository查询,将业务逻辑后移至Service层来解决这一问题,提出"简化查询,逻辑后移"的设计原则,强调数据访问层应保持简单,业务逻辑层负责加工处理。这种职责分离的方法既解决了启动问题,也优化了代码结构。
2025-08-23 17:11:31
1103
原创 JPA构造器表达式的“红线”之谜:当代码正确,IDE为何依然报错?
JPA构造器表达式IDE报错解析 当在JPA@Query中使用构造器表达式返回静态内部类DTO时,虽然代码能正常运行,但IDE会误报"无法解析符号"错误。这是由于IDE的静态分析器无法正确解析指向内部类的复杂路径。 解决方案: 将DTO从Repository接口中移出,创建独立类文件 放在专门的dto包中 更新@Query中的引用路径 这样做可以: 消除IDE误报 遵循单一职责原则 提高代码可读性和复用性 理解IDE警告背后的原理,选择更优的代码结构,既能保证功能正常,又能获得流畅的开发
2025-08-23 16:39:39
819
原创 一行代码的权衡:为JPA接口添加“最近使用”功能引发的性能思考
摘要 本文探讨了为JPA接口添加"最近使用"功能时引发的性能权衡问题。原本追求极致性能的addItemToSolution接口采用轻量级existsBy校验和getReference()代理,将数据库读取负载降到最低。但为实现记录最近使用时间的新功能,必须修改为加载完整实体Solution并进行更新,导致从极轻量SELECT变为普通SELECT查询。这种可控的性能"降级"换来了业务需求的实现和代码的健壮性,体现了架构师在业务需求与性能优化间的权衡能力。文章通过详细代码
2025-08-23 15:23:30
967
Windows版的redis-2.8.17.rar
2024-07-29
node-v11.15.0-win-x64和node-v14.18.2-win-x64
2024-07-29
LibreOffice-7.6.7-Win-x86-64.msi
2024-07-31
mongodb-compass-1.40.2-win32-x64.msi
2024-07-31
免费的硬件信息检测软件
2024-07-25
spzx-h5(尚品甄选H5)
2024-07-24
nginx-1.20.1.tar.gz
2024-07-24
mysql-installer-community-8.0.38.0.msi
2024-07-22
AppScan-Setup-10.4.0是AppScan软件的一个安装包版本,该版本为AppScan的10.4.0版本
2024-07-22
生成内网通的积分码、免广告码、开通红色昵称、姓名加冠、排名优先
2024-07-19
Snipaste-2.8.5-Beta-x64.rar
2024-07-19
Q-dir-installer-UC.exe
2023-09-13
apache-tomcat-10.1.7-windows-x64.zip
2023-09-08
Miniconda3-latest-MacOSX-arm64.sh 是一个 Miniconda 安装程序的文件名,专门用于特定类型的苹果电脑
2025-04-18
Eclipse Memory Analyzer Tool (MAT) 的 macOS 安装包
2025-04-09
Snipaste-2.10.5.dmg 是 Snipaste 软件的一个版本,专为 macOS 用户设计的磁盘映像文件(Disk Image File)
2025-03-18
阿里云官方开发的 OSS Browser(对象存储管理客户端)的安装文件,适用于 Apple Silicon 芯片(M系列芯片)的 Mac 电脑
2025-03-18
AppCleaner 是一款专为 macOS 设计的轻量级应用程序卸载工具
2025-01-21
FileZilla 是一款开源的跨平台 FTP(文件传输协议)客户端软件
2025-01-21
zulu8.82.0.21-ca-jdk8.0.432-macosx-aarch64.dmg
2024-11-26
python-2.7.18.amd64.msi
2024-11-13
mysql-installer-community-5.6.51.0.msi
2024-10-15
“WindTerm-2.5.0” 表明版本号是 2.5.0
2024-10-14
mysql-installer-community-5.5.60.1.msi
2024-10-13
tree-1.5.2.2-setup.exe
2024-10-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人