插入数据量大概是180条,如果要一条一条插入将要执行180条sql语句,如果按每次30条记录批量插入只需要执行6条插入语句,这样可以极大的提升性能。 首先是一条记录插入一次 <!-- lang: java --> for (KhDx khDx : dxList) { for (KhXm xmItem : xmList) { System.out.println(xmItem.getName()+"项目common="+xmItem.getIsCommon()+"当前对象的id"+khDx.getKhDxId()); if(xmItem.getIsCommon()==1){ System.out.println(xmItem.getName()+"项目common=1"); for (KhZb item : zbMap.get(xmItem.getKhXmId()+"")) { //zbInsertMap.get(khDx.getKhDxId()).add(new KhBRealTemp(item.getKhZbId(), khFormId, xmItem.getKhXmId(), item.getDeptId().getKhDxId(), khDx.getKhDxId(), khForm.getYear())); khBlist.add(khbRealDao.createKhbReal(item.getKhZbId(),khFormId,xmItem.getKhXmId(),item.getDeptId().getKhDxId(),khDx.getKhDxId(),khForm.getYear())); } }else if(xmItem.getKhDx().getKhDxId().equals(khDx.getKhDxId())){ System.out.println(xmItem.getName()+"项目common=0"); for (KhZb item : zbMap.get(xmItem.getKhXmId()+"")) { //zbInsertMap.get(khDx.getKhDxId()).add(new KhBRealTemp(item.getKhZbId(), khFormId, xmItem.getKhXmId(), item.getDeptId().getKhDxId(), khDx.getKhDxId(), khForm.getYear())); khBlist.add(khbRealDao.createKhbReal(item.getKhZbId(),khFormId,xmItem.getKhXmId(),item.getDeptId().getKhDxId(),khDx.getKhDxId(),khForm.getYear())); } } } khFormList.add(khFormDao.creatGenerated(khDx.getKhDxId(), khFormId)); } //khbRealDao.createKhbRealBatch(zbInsertMap); 这里是批量插入 <!-- lang: java --> Session session = super.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); for (Integer khDxId : zbInsertMap.keySet()) { int i = 0; KhFormGenerated khFormGenerated = new KhFormGenerated(); khFormGenerated .setKhForm(super.getHibernateTemplate().get(KhForm.class, zbInsertMap.get(khDxId).get(0).getKhFormId())); khFormGenerated.setKhDxId(khDxId); khFormGenerated.setZpState(1); session.save(khFormGenerated); for (KhBRealTemp temp : zbInsertMap.get(khDxId)) { i++;
KhBReal khBReal = new KhBReal();
khBReal.setDeptId(temp.getDeptId());
@SuppressWarnings("unchecked")
List<KhDx> khDxList = super.getHibernateTemplate().find(
"select khDx from KhDx khDx where khDx.khDxId=?",
khDxId);
khBReal.setKhDx(khDxList.get(0));
khBReal.setKhForm(super.getHibernateTemplate().get(
KhForm.class, temp.getKhFormId()));
khBReal.setKhXmId(temp.getKhXmId());
@SuppressWarnings("unchecked")
List<KhZb> list = super.getHibernateTemplate().find(
"select khZb from KhZb khZb where khZb.khZbId=?",
temp.getKhZbId());
khBReal.setKhZb(list.get(0));
khBReal.setYear(temp.getYear());
session.save(khBReal);
if (i % 30 == 0) {
session.flush();
session.clear();
}
}
}
tx.commit();
session.close();
可以看到批量插入和不是批量插入的性能对比,大概差了10倍。
思考:用多线程来执行大量数据插入,应该会更快