工作踩的坑之五多张表统计数据
来源:互联网 发布: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()的时候,如果别的线程一直在执行,难道一直要等待下去,我给它做得处理是:给一个等待时间,然后做一些处理。这个就不多说了,写这些日志是为了记录我自己在开发中遇到的问题,如果要详细讲的话,后面再分析,因为现在项目紧张,没有太多时间详细介绍,但是记性又不好,先写到这里。如果有错误,欢迎指正。
- 工作踩的坑之五多张表统计数据
- 百度统计数据导出服务踩的坑
- Mysql之统计数据
- 统计数据之HashMap
- 统计数据的一种表达方式
- 统计数据的真相
- 统计数据
- 统计数据
- Oracle 优化统计数据之直方图
- 最近一次的CSDN统计数据
- 统计数据的思考(上)
- 网站统计数据的名词解释(全)
- netty server 相关的统计数据
- Linux 内核相关的统计数据
- 查看某个Session的统计数据
- 100+有趣的统计数据集
- 计算每个月的统计数据
- sql2000学习笔记之select统计数据
- vb.net コマンドライン
- 任务计划程序设置优先级
- 中山培训 2016.7.11
- JS中的call()和apply()方法
- JAVA语言实现人机猜拳小游戏
- 工作踩的坑之五多张表统计数据
- 浅谈Java并发编程系列(六) —— 线程池的使用
- 欢迎使用CSDN-markdown编辑器
- linux下安装VMtools
- AOP注解日志处理简单理解
- Java phone,ip,idcard 获取地址信息
- pixhawk position_estimator_inav.cpp思路整理及数据流
- PHP开发环境软件安装
- 简易搭载NFS服务器