背手夹包剃炮头 2024-06-11 14:50 采纳率: 0%
浏览 7

两层循环里判断在修改数据 借口响应比较慢,怎么做才能让接口响应快一点!

这个是一个定时任务 请问下各位,这段代码该如何优化?目前是两层循环里判断在修改数据
,借口响应比较慢,怎么做才能让接口响应快一点!

public void regularlyRefreshTheOfStatusTheRoom() {
        List<AmsBed> amsBeds = amsBedService.selectAmsBedListTwo(new AmsBed());
        if (!CollectionUtils.isEmpty(amsBeds)) {
            for (AmsBed amsBed : amsBeds) {
                List<TRRoom> trRoomList = itrRoomService.selectTRRoomList(new TRRoom().setRoomNo(amsBed.getRoomNo()));
                if (!CollectionUtils.isEmpty(trRoomList) && trRoomList.size() == 1) {
                    amsBed.setRoomRemark(trRoomList.get(0).getRemark());
                    amsBed.setLockRoom(trRoomList.get(0).getLockRoom());
                    amsBed.setLockRoomWhy(trRoomList.get(0).getLockRoomWhy());
                    amsBed.setRoomStateCode(trRoomList.get(0).getRoomStateCode());
                    amsBed.setPublish(trRoomList.get(0).getPublish());
                    int i = amsBedService.updateAmsBed(amsBed);
                }
            }
        }
    }

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-11 14:50
    关注

    引自免费微信小程序:皆我百晓生

    面对接口响应慢的问题,尤其是当涉及多层循环和数据库操作时,有几种策略可以尝试以提升性能:

    1. 减少数据库查询次数:当前代码中,每次循环都会执行一次数据库查询,这非常低效。可以考虑将外部循环的查询结果一次性获取,然后在内部循环中直接使用。

    2. 批量更新:而不是逐条更新数据库,可以尝试批量更新,这样能显著减少与数据库的交互次数,从而提高效率。

    3. 使用缓存:如果数据不是实时变化的,可以考虑使用缓存来存储查询结果,减少对数据库的依赖。

    4. 异步处理:如果可能,可以将数据更新操作放到后台线程进行,这样不会阻塞主线程,提高响应速度。

    5. 数据库优化:确保数据库查询语句高效,使用索引,优化表结构等。

    针对你的代码,这里提供一个优化版本,使用批量更新和减少查询次数的方法:

    public void regularlyRefreshTheOfStatusTheRoomOptimized() {
        // 一次性获取所有beds
        List<AmsBed> amsBeds = amsBedService.selectAmsBedListTwo(new AmsBed());
        
        if (!CollectionUtils.isEmpty(amsBeds)) {
            Map<String, TRRoom> roomMap = new HashMap<>();
            
            // 一次性获取所有房间信息,并将其存储到map中以便快速查找
            List<TRRoom> trRoomList = itrRoomService.selectAllTRRooms();
            for (TRRoom trRoom : trRoomList) {
                roomMap.put(trRoom.getRoomNo(), trRoom);
            }
    
            List<AmsBed> updatedAmsBeds = new ArrayList<>();
            
            for (AmsBed amsBed : amsBeds) {
                TRRoom trRoom = roomMap.get(amsBed.getRoomNo());
                if (trRoom != null) {
                    amsBed.setRoomRemark(trRoom.getRemark());
                    amsBed.setLockRoom(trRoom.getLockRoom());
                    amsBed.setLockRoomWhy(trRoom.getLockRoomWhy());
                    amsBed.setRoomStateCode(trRoom.getRoomStateCode());
                    amsBed.setPublish(trRoom.getPublish());
                    
                    updatedAmsBeds.add(amsBed);
                }
            }
            
            // 批量更新
            amsBedService.batchUpdateAmsBed(updatedAmsBeds);
        }
    }
    

    注意,在上述代码中,selectAllTRRooms()batchUpdateAmsBed(List<AmsBed> amsBeds) 方法需要在你的服务层实现,它们分别用于一次性获取所有房间信息和批量更新床的信息。这些方法的实现取决于你的具体框架和数据库设计。如果使用的是JPA、MyBatis或其他ORM框架,通常都有相应的批量操作支持。

    通过这样的优化,接口的响应时间应该会有显著的改善。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月11日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见