前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >forkjoinpool 弊端_oracle数据库分页查询sql

forkjoinpool 弊端_oracle数据库分页查询sql

作者头像
全栈程序员站长
发布2022-09-27 15:15:12
1K0
发布2022-09-27 15:15:12
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

使用forkjoin框架分页查询所有数据的例子

代码语言:javascript
复制
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

@RestController
@RequestMapping("/test2")
@PropertySource("classpath:/application.properties")
@Slf4j
public class ForkJoinPollController { 
   

    @Autowired
    private SyncPersonInfoServiceImp syncPersonInfoService;

    @ApiOperation("测试forkJoinPoll")
    @GetMapping("/forkJoinPoll")
    public void forkJoinPoll(){ 
   
        log.info("forkJoinPoll start...");
        ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
        // 总页数,提前查询出来,数据量不大就不用拆任务
        int total = syncPersonInfoService.getTotal();
        int totalPage = (int)Math.ceil(total * 1.0 / IrdsConstant.PAGE_SIZE_MAX);
        SumTask innerFind = new SumTask(1, totalPage);
        pool.invoke(innerFind);
        List<VChrHkws> join = innerFind.join();
        pool.shutdown();
        log.info("forkJoinPoll end,size={}",join.size());
    }


    @AllArgsConstructor
    public class SumTask extends RecursiveTask<List<VChrHkws>> { 
   

        private final Integer fromIndex;
        private final Integer toIndex;

        @Override
        protected List<VChrHkws> compute() { 
   
            // 如果任务足够小就触发任务
            if (toIndex - fromIndex < 2) { 
   
                List<VChrHkws> list = new ArrayList<>();
                for (int pageNo = fromIndex; pageNo <= toIndex; pageNo++) { 
   
                    ApiPageListData<VChrHkws> pageData = syncPersonInfoService.getPageListData(pageNo, IrdsConstant.PAGE_SIZE_MAX);
                    // 查询数据库返回值
                    list.addAll(pageData.getList());
                }
                return list;
            } else { 
   
                // 如果任务大于阈值,就分裂成两个子任务计算
                int mid = (fromIndex + toIndex) / 2;
                SumTask left = new SumTask(fromIndex, mid);
                SumTask right = new SumTask(mid + 1, toIndex);
                invokeAll(left, right);
                List<VChrHkws> join = left.join();
                join.addAll(right.join());
                return join;
            }
        }
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193232.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用forkjoin框架分页查询所有数据的例子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档