**
原方案:
**
几万条数据采用Mybatis的标签进行多行插入,大约用时50s.
**
一次优化方案
**
对集合进行分段,然后再用多行插入,大约用时40s
部分代码如下
List<Fare_Group> list1 = new ArrayList();
for (Iterator iterator = arrayList1.iterator(); iterator.hasNext();) {
JSONObject obj = (JSONObject) iterator.next();
Fare_Group tm = obj.toJavaObject(Fare_Group.class);
tm.setParaVersion(paraVersion);
list1.add(tm);
}
if(list1.size()>0){
tbl_Pm_HisOperDao.moveTableHis("FARE_GROUP_HIS","FARE_GROUP");
tbl_Pm_HisOperDao.deleteTableList("FARE_GROUP");
if (list1.size()<1000){
Fare_GroupDao.addFare_Group(list1);
} else {
int inertAmount = 0;
List<Fare_Group> newList1;
for (int start=0 ; start<list1.size()-1000 ; start+=1000) {
newList1 = list1.subList(start,start+1000);
Fare_GroupDao.addFare_Group(newList1);
inertAmount = start + 1000;
}
newList1 = list1.subList(inertAmount,list1.size());
Fare_GroupDao.addFare_Group(newList1);
}
}
**
最终方案
**
使用并行容器进行并行插入操作,并把集合分成每100条一份,再放入一个大集合中,进行多行插入,大约用时7s
代码如下
List<_Fare_Group> list1 = new ArrayList<>();
List<List<_Fare_Group>> listFinal = new CopyOnWriteArrayList<>();
for (Object o : arrayList1) {
JSONObject obj = (JSONObject) o;
_Fare_Group tm = obj.toJavaObject(_Fare_Group.class);
tm.setParaVersion(paraVersion);
list1.add(tm);
}
List<_Fare_Group> listTemp = new CopyOnWriteArrayList<>(list1);
if (listTemp.size() > 0) {
tbl_Pm_HisOperDao.moveTableHisWithTime("_FARE_GROUP_HIS", "_FARE_GROUP");
tbl_Pm_HisOperDao.deleteTableList("_FARE_GROUP");
if (listTemp.size() < sqlNum) {
_Fare_GroupDao.add_Fare_Group(listTemp);
} else {
int inertAmount = 0;
List<_Fare_Group> newList1;
for (int start = 0; start < listTemp.size() - sqlNum; start += sqlNum) {
newList1 = listTemp.subList(start, start + sqlNum);
listFinal.add(newList1);
inertAmount = start + sqlNum;
}
newList1 = listTemp.subList(inertAmount, listTemp.size());
listFinal.add(newList1);
listFinal.parallelStream().forEach(x -> _Fare_GroupDao.add_Fare_Group(x));
}
}