记一次Jpa 账单excel批量导出问题

 账单excel导出|获取的账单数orderModerns=173

执行时间time=178140ms

执行时间time=61212ms

执行时间time=1527ms

 

一、同事写的常见处理方法

 

由于是动态多条件查询,jpa很麻烦,先根据条件查出用户Id List, 再根据用户Id List 查出账单 List ,遍历账单List,关联用户id查询用户信息一个个set进去,=====慢慢慢

 

 log.info("根据查询条件拿到人员Id列表");

            System.out.println("+++++++++++++++++++++++++++++++++++++++++++++"+req.getOrganization_id());

            String name=req.getUserName();
            if (StringUtils.isNotBlank(name))name="%"+name+"%";
            orderUserList = crmUserDao.findByCondition(name, req.getOrganization_id(),req.getBranch_id());
            log.info("orderUserList:"+orderUserList.size());

            log.info("根据人员id列表和其余条件拿到订单列表");
            orderList = orderOrderDao.findPagePcByUserCondition(orderUserList,
                    req.getPayStatus(),
                    req.getOrderDate(),
                    req.getPayTimeStart(),
                    req.getPayTimeEnd(),
                    pageable);
            count = orderOrderDao.countByUserCondition(orderUserList,
                    req.getPayStatus(),
                    req.getOrderDate(),
                    req.getPayTimeStart(),
                    req.getPayTimeEnd());
        }


            for (int i= 0; i<orderList.size(); i++) {
                //根据订单查询组织名称
                ApiPcOrderResp.order  orderModern = new ApiPcOrderResp.order();
                SysOrganization sysOrganization = sysOrganizationDao.getOne(orderList.get(i).getOrganizationId());
                //根据人员id查询人员信息
                CrmUser user = crmUserDao.getOne(orderList.get(i).getOrderUser());
                //根据人员id查询部门名称
                SysCoBranch sysCoBranch = sysCoBranchDao.getOne(user.getSysCoBranchId());

                orderModern.setOrderId(orderList.get(i).getOrderId());
                orderModern.setOrderNum(orderList.get(i).getOrderNum());
                orderModern.setWaterNum(orderList.get(i).getWaterNum());
                orderModern.setAmount(orderList.get(i).getAmount());
                orderModern.setDescription(orderList.get(i).getDescription());
                orderModern.setPayStatus(orderList.get(i).getPayStatus());
                orderModern.setOrderDate(orderList.get(i).getOrderDate());
                orderModern.setOrderUser(orderList.get(i).getOrderUser());
                orderModern.setOrganizationId(orderList.get(i).getOrganizationId());
                orderModern.setRemark(orderList.get(i).getRemark());
                orderModern.setModifyUser(orderList.get(i).getModifyUser());
                orderModern.setModifyTime(orderList.get(i).getModifyTime());
                orderModern.setSystemTime(orderList.get(i).getSystemTime());
                orderModern.setPayUserName(user.getName());
                orderModern.setOrganizationName(sysOrganization.getName());
                orderModern.setBranchName(sysCoBranch.getName());
                respList.add(orderModern);

            }
            resp.setContactItems(respList);
            resp.setCount(count.intValue());

二、我将用户关联信息查询set处启线程执行,还是慢

 

/**
     * 账单excel导出
     */
    @ResponseBody
    @RequestMapping(value = "/excelOrder", method = RequestMethod.POST)
    public SystemResult excelOrder(long companyId,ApiPcOrderReq req, HttpServletRequest request, HttpServletResponse response) {
        log.info("账单excel导出入参companyId={},ApiPcOrderReq={}", companyId,JSONObject.toJSONString(req));
        long startTime=System.currentTimeMillis();   //获取开始时间
        //根据多条件查询userList
        String name=req.getUserName();
        if (StringUtils.isNotBlank(name))name="%"+name+"%";
       List<Integer> orderUserIds = crmUserDao.findByCondition(name, req.getOrganization_id(),req.getBranch_id());
        log.info("账单excel导出|orderUserIds={}",orderUserIds.size());

        log.info("根据人员id列表和其余条件拿到订单列表");
        List<OrderOrder>orders = orderOrderDao.findExcelOrders(orderUserIds,
                req.getPayStatus(),
                req.getOrderDate(),
                req.getPayTimeStart(),
                req.getPayTimeEnd());

        //遍历查询部门支部名称信息
        List<ApiPcOrderResp.order> orderModerns=new ArrayList<ApiPcOrderResp.order>();

        ExecutorService es = Executors.newCachedThreadPool();
        for (OrderOrder order:
        orders) {
            Thread thread=new Thread(()->{
                getAllNames(orderModerns, order);
            });
            es.execute(thread);
        }
        /*
         * es.shutdown(); 阻止新任务的提交,但是原本已经提交的,不会受到影响,当已提交的任务全部完成后,中断闲置的线程
         * es.shutdownNow(); 阻止新任务的提交,且已提交的任务也会受到影响,不等已提交的任务完成,就会中断所有的线程。
         */
        es.shutdown();
        log.info("账单excel导出|获取的账单数orderModerns={}", orderModerns.size());

        try {
            myLock(es,orderModerns,request,response,companyId);
        } catch (Exception e) {
            e.printStackTrace();
            result=new SystemResult(Dict_transaction_result_code.SYSTEM_EXCEPTION,"账单excel导出|excel系统异常",companyId);
            log.info("账单excel导出result={}", JSONObject.toJSONString(result));
            return result;
        }

        result=new SystemResult(Dict_transaction_result_code.SUCCESS,"账单excel导出",companyId);
        log.info("账单excel导出result={}", JSONObject.toJSONString(result));
        long endTime=System.currentTimeMillis();   //获取开始时间
        log.info("=============执行时间time={}ms",endTime-startTime);
        return result;
    }

    private void myLock(ExecutorService es,List<ApiPcOrderResp.order> orderModerns, HttpServletRequest request, HttpServletResponse response,long companyId) throws IOException, InterruptedException {
        if (es.isTerminated()) {
            excelService.excelOrder(orderModerns,request,response,companyId);
        } else {
            Thread.sleep(1000 * 60); // 1000 毫秒,也就是1秒.1分
            myLock(es,orderModerns,request,response,companyId);
        }
    }

    private void getAllNames(List<ApiPcOrderResp.order> orderModerns, OrderOrder order) {
        ApiPcOrderResp.order orderModern = new ApiPcOrderResp.order();

        SysOrganization sysOrganization = sysOrganizationDao.getOne(order.getOrganizationId());
        //根据人员id查询人员信息
        CrmUser user = crmUserDao.getOne(order.getOrderUser());
        //根据人员id查询部门名称
        SysCoBranch sysCoBranch = sysCoBranchDao.getOne(user.getSysCoBranchId());

        orderModern.setOrderId(order.getOrderId());
        orderModern.setOrderNum(order.getOrderNum());
        orderModern.setWaterNum(order.getWaterNum());
        orderModern.setAmount(order.getAmount());
        orderModern.setDescription(order.getDescription());
        orderModern.setPayStatus(order.getPayStatus());
        orderModern.setOrderDate(order.getOrderDate());
        orderModern.setOrderUser(order.getOrderUser());
        orderModern.setOrganizationId(order.getOrganizationId());
        orderModern.setRemark(order.getRemark());
        orderModern.setModifyUser(order.getModifyUser());
        orderModern.setModifyTime(order.getModifyTime());
        orderModern.setSystemTime(order.getSystemTime());
        orderModern.setPayUserName(user.getName());
        orderModern.setOrganizationName(sysOrganization.getName());
        orderModern.setBranchName(sysCoBranch.getName());
        orderModerns.add(orderModern);
    }

 

三、改用批量

 /**
     * 账单excel导出
     */
    @RequestMapping(value = "/excelOrder")
    public void excelOrder(long companyId,ApiPcOrderReq req, HttpServletRequest request, HttpServletResponse response) {
        log.info("账单excel导出入参companyId={},ApiPcOrderReq={}", companyId,JSONObject.toJSONString(req));
        long startTime=System.currentTimeMillis();   //获取开始时间
        //根据多条件查询userList
        String name=req.getUserName();
        if (StringUtils.isNotBlank(name))name="%"+name+"%";
       List<Integer> orderUserIds = crmUserDao.findByCondition(name, req.getOrganization_id(),req.getBranch_id());
        log.info("账单excel导出|orderUserIds={}",orderUserIds.size());


        ArrayList<BigInteger>orderIds = orderOrderDao.findOrderIds(orderUserIds,
                req.getPayStatus(),
                req.getOrderDate(),
                req.getPayTimeStart(),
                req.getPayTimeEnd());

        if (orderIds==null) return ;
        log.info("根据人员id列表拿到订单列表orderIds={}",orderIds.size());
        //根据orderIds联查获取用户信息,部门等
        //Long[] orderIdsArray = orderIds.toArray(new Long[orderIds.size()]);
        //Long[] orderIdsArray = orderIds.stream().toArray(Long[]::new);
        //long [] array = orderIds.stream().mapToLong(t->t.longValue()).toArray();
        Long[] orderIdsArray = new Long[orderIds.size()];
        for (int i = 0; i <orderIds.size() ; i++) {
            orderIdsArray[i]=orderIds.get(i).longValue();
        }
        List<UserOrderInfo> userOrderInfoAll = orderOrderDao.findUserOrderInfoAll(orderIdsArray);

        try {
            excelService.excelOrder(userOrderInfoAll,request,response,companyId);
        } catch (IOException e) {
            e.printStackTrace();
        }

        result=new SystemResult(Dict_transaction_result_code.SUCCESS,"账单excel导出成功",companyId);
        log.info("账单excel导出result={}", JSONObject.toJSONString(result));
        long endTime=System.currentTimeMillis();   //获取开始时间
        log.info("=============执行时间time={}ms",endTime-startTime);
    }

 

 

其实线程应该还是可以的,只是sleep了6000,后来才看到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值