工作踩的坑之五多张表统计数据
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()的时候,如果别的线程一直在执行,难道一直要等待下去,我给它做得处理是:给一个等待时间,然后做一些处理。这个就不多说了,写这些日志是为了记录我自己在开发中遇到的问题,如果要详细讲的话,后面再分析,因为现在项目紧张,没有太多时间详细介绍,但是记性又不好,先写到这里。如果有错误,欢迎指正。
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()的时候,如果别的线程一直在执行,难道一直要等待下去,我给它做得处理是:给一个等待时间,然后做一些处理。这个就不多说了,写这些日志是为了记录我自己在开发中遇到的问题,如果要详细讲的话,后面再分析,因为现在项目紧张,没有太多时间详细介绍,但是记性又不好,先写到这里。如果有错误,欢迎指正。
相关文章推荐
- 显示应用选择器
- 阅读笔记(三)
- html5语义化标签
- LeetCode 169. Majority Element
- 提高项目30.2-字符串处理函数 指针形参
- 红黑树(代码实现)
- Git和Github的应用与命令方法总结
- ACM--公约数为1--HDOJ 1014--Uniform Generator--水
- 以获取和添加联系人为例学习调用系统ContentPrivider
- 堆排序中的上滤和下滤
- 第58章、拍照功能实现(从零开始学Android)
- java中创建线程的的几种方式
- 一台服务器的黑道生涯之二 喜结良缘
- 面向对象的几个基本关键字(一)
- 约瑟夫问题
- 简易搭载NFS服务器
- jquery multiselect如何实现下拉框多选并获取多个选项的值
- JAVA学习笔记(一)
- springmvc拦截器实例
- 大话设计模式(Golang) 二、策略模式