您的位置:首页 > 其它

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

2016-07-11 21:27 190 查看
还是最近的项目,这个项目大部分功能是一个统计功能,所以离不开对多张表查询,然后统计。有这么一个功能,公司跟别人签订合约成为联盟关系,对方作为我们公司业务项目的推广方,到了次月初是要给上月推广的一个佣金,上月的不仅需要给别人佣金,也有其他规则给推广方其他方面的奖励,而此时,财务部门只认定最终的计算金额,而且需要合并计税之后的结果,那么必然会在一张表里面显示来自两个业务的金额,然后合并之后算的税后结果。那么问题来了,我的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()的时候,如果别的线程一直在执行,难道一直要等待下去,我给它做得处理是:给一个等待时间,然后做一些处理。这个就不多说了,写这些日志是为了记录我自己在开发中遇到的问题,如果要详细讲的话,后面再分析,因为现在项目紧张,没有太多时间详细介绍,但是记性又不好,先写到这里。如果有错误,欢迎指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: