博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
减少与数据库的连接,提高请求效率
阅读量:7233 次
发布时间:2019-06-29

本文共 3006 字,大约阅读时间需要 10 分钟。

工时系统代码优化记录:

在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。

一年有12个月,一个人有多个项目。

初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库中获取该用用户的工时统计。

这样就造成了多次请求数据库,强求效率很低。差不多查询一次要2500ms的时间。这样肯定的不行的。

优化:优化采用每个项目只与数据库建立一次连接。采用存储过程进行调用。

这样就将数据库的连接次数大大减少了。

以下是没有优化前的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
工时系统:
查看工时详情,(
4
个项目为例子)
原来的代码请求数据库
2
*
12
*
4
+
1
=
97
次。
优化后的数据,请求数据库
5
次(首先查询所有的项目,然后每个项目去查询一次。)
 
        
/*
         
* 查询项目在每月已提交的工时
         
*/
        
// 查询每个人的项目id
        
List<WorkDetail> workDetailList = workDetailManager.getProjectIdByUser(userId);
//第一次
        
List<Project> projectList = 
new 
ArrayList<>();
        
for 
(WorkDetail workDetail : workDetailList) {
//循环4次
            
Integer projectId = workDetail.getProjectId();
            
Project project = projectManager.get(projectId);
            
// 每月去查询
            
for 
(
int 
i = 
0
; i < countMonth; i++) {
//循环12次
                
Double reportCount = 
new 
Double(
"0"
);
                
String workDay = String.valueOf(year) + months[i];
                
WorkDetailQuery query = 
new 
WorkDetailQuery();
                
query.setState(
10
);
                
query.setProjectId(projectId);
                
query.setUserId(userId);
                
// 如果当月还没有到月底,统计至当天的前一天为准。
                
Integer beforNowDay = Integer.valueOf(dateStr) - 
1
;
                
if 
(workDay.equals(dateStr.substring(
0
6
))) {
                    
query.setStartDate(workDay + 
"01"
);
                    
query.setEndDate(beforNowDay.toString());
                    
query.setWorkType(
"FUL"
);
                    
Integer fulCount1 = workDetailManager.count(query);
//查询是半天还是全天  每月循环一次
                    
query.setWorkType(
"PAR"
);
                    
Integer parCount1 = workDetailManager.count(query);
//查询是半天还是全天  每月循环一次
                    
reportCount = (parCount1.doubleValue() / 
2
) + fulCount1.doubleValue();
                
else 
{
                    
query.setWorkDay(Integer.valueOf(workDay));
                    
query.setWorkType(
"FUL"
);
                    
Integer fulCount = workDetailManager.count(query);
                    
query.setWorkType(
"PAR"
);
                    
Integer parCount = workDetailManager.count(query);
                    
reportCount = (parCount.doubleValue() / 
2
) + fulCount.doubleValue();
                
}
                
if 
(reportCount == 
0.0
) {
                    
reportCount = 
null
;
                
}
                
// 保存到每个月
                
if 
(
"01"
.equals(months[i])) {
                    
project.setJanCount(reportCount);
                
else 
if 
(
"02"
.equals(months[i])) {
                    
project.setFebCount(reportCount);
                
else 
if 
(
"03"
.equals(months[i])) {
                    
project.setMarCount(reportCount);
                
else 
if 
(
"04"
.equals(months[i])) {
                    
project.setAprCount(reportCount);
                
else 
if 
(
"05"
.equals(months[i])) {
                    
project.setMayCount(reportCount);
                
else 
if 
(
"06"
.equals(months[i])) {
                    
project.setJunCount(reportCount);
                
else 
if 
(
"07"
.equals(months[i])) {
                    
project.setJulCount(reportCount);
                
else 
if 
(
"08"
.equals(months[i])) {
                    
project.setAugCount(reportCount);
                
else 
if 
(
"09"
.equals(months[i])) {
                    
project.set SeptCount(reportCount);
                
else 
if 
(
"10"
.equals(months[i])) {
                    
project.setOctCount(reportCount);
                
else 
if 
(
"11"
.equals(months[i])) {
                    
project.setNovCount(reportCount);
                
else 
if 
(
"12"
.equals(months[i])) {
                    
project.setDecCount(reportCount);
                
}
            
}
            
projectList.add(project);
        
}
        

优化后速度很大提升,请求时间一般为180ms,满足实际需求。

总结:报表查询中一定要减少请求数据库的次数。尽量采用多表查询或存储过程调用的方式。

      本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/1925239,如需转载请自行联系原作者

你可能感兴趣的文章
程序员修炼之道的提示们(1)
查看>>
变速动画函数封装增加任意一个属性
查看>>
解决弹出的窗口window.open会被浏览器阻止的问题(自定义open方法)
查看>>
可编辑tab选项卡
查看>>
while循环小例
查看>>
eclipse项目打包
查看>>
修改Liunx服务器SSH端口
查看>>
关于SoftReference的使用
查看>>
微笑的眼泪
查看>>
Flex4之DataGrid增删改同步数据库及页面数据示例总结
查看>>
Hadoop平台基本组成
查看>>
java -cp & java jar的区别
查看>>
wpf编写一个简单的PDF转换的程序
查看>>
Win7无线网络显示未连接但可以上网的解决办法
查看>>
浏览器根对象navigator之客户端检测
查看>>
加入一个团队时要弄清楚自己在团队中投入的级别是什么, 别人的期望值是什么. 不要拿着卖白菜的钱, 操那卖白粉的心(转)...
查看>>
expect基础教程
查看>>
ZOJ Problem Set - 3329(概率DP)
查看>>
20款超酷的jQuery插件-随心所欲
查看>>
python urllib2查询数据
查看>>