性能调优

最近又修改了一个有关性能的BUG。

虽然在一般情况下,效率不是什么大问题,只要程序结构良好,在测试期间发现有性能瓶颈在做相应的性能调优是可行的。但是,不要忽视一点,能够在数据库中完成的操作,尽量不要放在程序中进行处理;能够用一条SQL语句完成的操作,尽量不要用多条SQL语句去完成。毕竟数据库系统已经发展了很多年,非常成熟,性能也是非常高。

最近修改的几个BUG,都是与数据访问相关的。

这个BUG是因为非常低效率的使用数据库,将大量可以放在数据库中完成的计算逻辑拿到应用程序中来完成所造成的。
我们的数据访问底层采用的是HIBERNATE, 在原来的实体工具上进行了一点封装,使得可以使用hql来操作数据库。这比原来的实体工具性能和功能上都更进一步。

取解决BUG的总时间的逻辑是:对于一个BUG,找到它所有相关的BUG_HISTORY,根据BUG_HISTORY中Action是5(解决)或者10(修改解决方案),找到所有的BUG_FIELD_HISTORY,找到其中FIELD是12的域,取出NEW_VALUE和OLD_VALUE,计算差值,然后求和,得到所有BUG的总解决时间

BUG -> BUG_HISTORY -> BUG_FIELD_HISTORY
1 N 1 N

采用hql来写的话,也就是
[code]String hql1="select bfh.newValue, bfh.oldValue from BugFieldHistory as bfh, BugHistory as bh, Bug as b " +
"where bfh.field=12 and bfh.bugHistoryId = bh.id and (bh.action =5 or bh.action = 10) and bh.bugId = b.bugId and b.testReportId = "+
report.getTestReportId();[/code]
这样就可以了。

本来可以更近一步的,直接取sum(bfh.newValue-bfh.oldValue),但是由于newValue和oldValue对应的数据库字段类型是text,直接做减法,然后sum,在有些数据库中不支持。

因此,这次优化只能达到这个地步。如果是只支持mysql系统的话,那么就采用上述方法,直接就求到了结果。目前,为了支持多数据源,只好牺牲一下效率了,把结果放到JAVA代码中实现。
[code]
for (Iterator iter = resultList.iterator(); iter.hasNext();) {
Object[] element = (Object[]) iter.next();
Float newValue = new Float((String)element[0]);
if(null==element[1]){
result += newValue;
}else{
Float oldValue = new Float((String)element[1]);
result += (newValue-oldValue);
}
}[/code]

遍历得到的列表,然后执行求和操作。因为要遍历列表,采用iterator的方式去遍历,性能应该不低。

还有另外一类BUG: 需求是要计算按照某种分类条件的BUG数目。

原来的实现方式是对于每一种分类,将符合条件的记录都选出来,取list的长度。其实这明显是一个典型的分组统计,直接使用group by分组统计就可以了。当然,group by的时候,count为0的记录不会输出。那么,对于这种情况,需要程序另外处理。

[code] String hql = "select count(b.bugId), b.bugClass from Bug as b where b.testReportId = " + reportId
+" group by b.bugClass";
[/code]
然后,我们把列表中的元素取出来,构造hashmap,然后取每一种bugClass所对于的统计值,如果没有,那自然就是0:)

这样子,通过一条语句,就完成了需要N条语句才能完成的工作。

最后,在需要统计数字的时候,我们可以直接count(*)就能够知道统计结果。不需要select * ,然后再去取list的值。没有必要,这种数据库能做的事情都让数据库做了就OK了。

一定要充分发挥数据库的性能优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值