在一个批量Insert业务中,使用多线程进行约束insert。其中出现的一个问题。

部分数据是成功insert的。 百度得知此问题发生的原因是:在循环迭代中,如果对Vetor、ArrayList进行修改,就可能对抛出这个异常。仔细错误检查代码:entryList的作用域过大,并且,在后面做了entryList.clear的操作。对象还是那个对象,只是把里面的元素清空了而已。
仔细错误检查代码
List<InStorageMissionEntry> entryList = new ArrayList<InStorageMissionEntry>();
for (String billno : fbillnos) {
InStorageMission mission = setMission(user);
//entryList = new ArrayList<InStorageMissionEntry>();
for (PurReceiveOrder purReceiveOrder : purReceiveOrderList) {
String fbillno = purReceiveOrder.getFbillno();
if(billno.equals(fbillno)) {
mission.setRecOrgId(purReceiveOrder.getRecOrgId());
mission.setRecOrgNumber(purReceiveOrder.getRecOrgNumber());
InStorageMissionEntry setEntry = setEntry(user,purReceiveOrder);
entryList.add(setEntry);
Integer Fid = purReceiveOrder.getfId();
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("billId", Fid);
map.put("entryId", purReceiveOrder.getEntryId());
map.put("missionStatus", 3);
mapList.add(map);
}
}
System.out.println("entryList====="+entryList.size());
if(mission!=null && entryList !=null && entryList.size()>0) {
try {
synchronized (this) {
inStorageMissionService.insertInStorageMission(mission, entryList);
msg = new Msg();
msg.setCode(100);
msg.setMsg("");
msg.setObject(mission);
msgList.add(msg);
mission=null;
entryList.clear();
}
} catch (Exception e) {
e.printStackTrace();
return Msg.defineFail("")+"";
}
}
}
修改后的正确代码应该是:
List<InStorageMissionEntry> entryList =null;
for (String billno : fbillnos) {
InStorageMission mission = setMission(user);
entryList = new ArrayList<InStorageMissionEntry>();
for (PurReceiveOrder purReceiveOrder : purReceiveOrderList) {
String fbillno = purReceiveOrder.getFbillno();
if(billno.equals(fbillno)) {
mission.setRecOrgId(purReceiveOrder.getRecOrgId());
mission.setRecOrgNumber(purReceiveOrder.getRecOrgNumber());
InStorageMissionEntry setEntry = setEntry(user,purReceiveOrder);
entryList.add(setEntry);
Integer Fid = purReceiveOrder.getfId();
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("billId", Fid);
map.put("entryId", purReceiveOrder.getEntryId());
map.put("missionStatus", 3);
mapList.add(map);
}
}
System.out.println("entryList====="+entryList.size());
if(mission!=null && entryList !=null && entryList.size()>0) {
try {
synchronized (this) {
inStorageMissionService.insertInStorageMission(mission, entryList);
msg = new Msg();
msg.setCode(100);
msg.setMsg("成功");
msg.setObject(mission);
msgList.add(msg);
mission=null;
//entryList.clear();
}
} catch (Exception e) {
e.printStackTrace();
return Msg.defineFail("错误")+"";
}
}
}
在第一次for循环中,重新new了一个entryList,这是个全新的entryList,同时不用再使用entryList.clear()对其清空。因此就不存在修改了ArrayList。
总结:
代码简介之美还得多学学,多看看啊。虽然java的GC机制帮我们做了很多垃圾回收工作,但是在程序中也应该尽量慎重选择对象的作用域。作用域能小则小,过了那个作用域,对象的引用为空了,GC就对其进行回收,内存的堆区不必因为存在太多对象而占用内存。
1033



被折叠的 条评论
为什么被折叠?



