hibernate 插入性能优化——批量插入

插入数据量大概是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倍。

思考:用多线程来执行大量数据插入,应该会更快

转载于:https://my.oschina.net/u/255939/blog/410389

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值