工作踩的坑之五多张表统计数据

来源:互联网 发布:mac开机一半自动关机 编辑:程序博客网 时间:2024/04/28 14:32

还是最近的项目,这个项目大部分功能是一个统计功能,所以离不开对多张表查询,然后统计。有这么一个功能,公司跟别人签订合约成为联盟关系,对方作为我们公司业务项目的推广方,到了次月初是要给上月推广的一个佣金,上月的不仅需要给别人佣金,也有其他规则给推广方其他方面的奖励,而此时,财务部门只认定最终的计算金额,而且需要合并计税之后的结果,那么必然会在一张表里面显示来自两个业务的金额,然后合并之后算的税后结果。那么问题来了,我的sql还没有到达炉火纯青的地步,而且mysql也不建议在查询中去计算,因此我就在mysql中做了一些简单的统计,但是两个不同业务金额还是不能合并在一起,势必需要推广方的id去别的表里进行统计计算,刚开始的时候是想,先算出一个业务金额,然后取出来id来个for循环,再去数据库查一次,但是这一次的查询又有别的统计查询,所以没办法做到批量查询(也就是说把所有的id传过去,sql里面用IN来实现),但是设计到需要统计,所以这个是没法实现的,总不能for循环,一个一个传过去查询吧。这样就是在不断的连接断开数据库了,数据多了,性能也是很低的。而且也不建议频繁的操作数据库断开连接。所以只能想别的方法了,我只好写了一个线程来完成这件事:代码如下:

package com.wang.spring.demo.service;

public class Test {
    private void countAllFirstUser(List<Model> modelResult) {
        long doneTime = System.currentTimeMillis();
        // 多线程同步辅助类
        CountDownLatch end = new CountDownLatch(modelResult.size());

        for (Model model : modelResult) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    try {

                           //查询并统计

                        getFirstInvestRewards(model);
                    } catch (Exception e) {
                        log.error(model.getAgentId() + "获取***奖励失败!" + e);
                    } finally {
                        end.countDown();
                    }
                }

            });
        }

        try {
            end.await();
        } catch (Exception e) {
        }
        log.info("get ************  ... execution time:{} ms!!", (System.currentTimeMillis() - doneTime));
    }

}


但是这里还有一个问题,就是end.await()的时候,如果别的线程一直在执行,难道一直要等待下去,我给它做得处理是:给一个等待时间,然后做一些处理。这个就不多说了,写这些日志是为了记录我自己在开发中遇到的问题,如果要详细讲的话,后面再分析,因为现在项目紧张,没有太多时间详细介绍,但是记性又不好,先写到这里。如果有错误,欢迎指正。

0 0
原创粉丝点击