Ticket #139 (closed Bug: fixed)
品牌排位接口死循环bug总结
| Reported by: | huangyucai | Owned by: | 黄育才 |
|---|---|---|---|
| Priority: | major | Milestone: | |
| Component: | 产品库 | Version: | 产品库3.0 |
| Keywords: | bug,故障 | Cc: | |
| Due Date: | 02/08/2013 |
Description
一、问题展示
1)cms报障,接口不能出数据,请求响应慢
2)检查服务器负载高,超过6.0,但是其他能正常访问
3)用threads.jsp检查发现
brand_type_top_json.jsp的线程一直在运行
初步判断可能:
1、接口被刷
2、程序存在死循环
应急解决:
试着重启一台服务器,检查负载,发现不会升高
二、问题代码
1、代码段
for (int i =0, size = brandList.size(); i < size; i ++) {
brandId=0;
if(fixMap!=null&&fixMap.get(index+1)!=null){//如果存在固定排位
brandId=Integer.parseInt(fixMap.get(index+1).toString());//获取品牌的id
}
if(brandId==0){//没有固定排位则从列表获取品牌的id
record = (Record)brandList.get(i);
brandId = record.getValue("ID").asInt();
}else{//否则回退一次列表
i--;
}
//去重处理
if(brandSet.contains(brandId)) continue;//如果已经有品牌id就跳过不添加
brandSet.add(brandId);
//...省略封装json的代码
index++;//条数自增
if(index>=max) break;//达到数量就跳出
}
2、bug产生过程
死循环Bug分析:
当brandList.size()=10,
brandList.get(2).getValue("ID").asInt()=39127
fixMap<10,39127>
循环当i=9
执行 brandId=Integer.parseInt(fixMap.get(index+1).toString());
执行 i--;
执行 if(brandSet.contains(brandId)) continue;如果已经有品牌id就跳过
不添加
此时i=8 执行循环i++
i=9
再执行循环,构成死循环
三、修改代码
加多两次循环,让代码结构和逻辑明朗化
for(int i=0;i<brandList.size();i++){//先存入到brandIdList
record = (Record)brandList.get(i);
brandIdList.add(record.getValue("ID").asString());
}
if(fixMap!=null){//如果存在固定排位
int size=brandIdList.size();//长度
for(int i=0;i<size;i++){//迭代
Object fixed=fixMap.get(i+1);
if(fixed!=null){//如果指定当前位置中有固定
if(brandIdList.contains(fixed.toString())){//如果已经存在,则先删除
brandIdList.remove(fixed.toString());
}
brandIdList.add(i,fixed.toString());//添加到固定位置
}
}
}
for(int i=0;i<max&&i<brandIdList.size();i++){//迭代组装json
}
四、总结:
1)逻辑较为复杂接口,在实现的时候要一步步来,代码要详细,条理清晰,这样可读性好,而且不容易出错
2)上线前测试要充分,不急于求成
Attachments
Change History
Changed 13 years ago by huangyucai
-
attachment
brand_type_top_json.jsp_bug.jsp
added
Note: See
TracTickets for help on using
tickets.
![(please configure the [header_logo] section in trac.ini)](http://www1.pconline.com.cn/hr/2009/global/images/logo.gif)
问题jsp