hibernate保存十万级数据量的批量保存操作,

图一是我导入的第一张表,最大数据量也就2万多条,hibernate关闭二级缓存勉强能够导入,导入图二的7万多条数据时,就会在执行hibernate的save()停在2万多条.

hibernate保存十万级数据量的批量保存操作,_第1张图片hibernate保存十万级数据量的批量保存操作,_第2张图片


具体配置:

1.修改spring的管理hibernate的配置

init-method="init" destroy-method="close">  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 value="50" />  
   
   
  
  
  
 <  
   
     org.hibernate.dialect.MySQLDialect  
     org.springframework.orm.hibernate4.SpringSessionContext  
     false  
     none  
     false
     false  
     50  
     500  
     false  
             
  
  
  
  
         classpath:com/greatchn/htykj/db/po/*.hbm.xml  
  
  
  
  
      
  
  
  
  
  
  
  
  
  
 

把hibernate的批量操作设置为:500,关闭hibernate的二级缓存.

注意:做海量数据批量操作一定要关闭显示执行的sql语句.(我导入7万多条数据,停在2万条有一个原因就是这个).


@Controller层: 因为数据量太大,把查询查询到List分成10000条一份,分批次执行保存方法

zwPzfls是查询的到74711条的数据,

		int p = 0;
		if (zwPzfls.size() % 10000 == 0) {
			p = zwPzfls.size() / 10000;
		} else {
			p = zwPzfls.size() / 10000 + 1;
		}

		List zwPzflstemp = new ArrayList();
		System.out.println("共" + p + "批");
		for (int k = 1; k <= p; k++) {
			if (k == p) {
				System.out.println("第" + k + "批的10000条开始");
				for (int l = (k - 1) * 10000; l < zwPzfls.size(); l++) {
					ZwPzfl fl = zwPzfls.get(l);
					zwPzflstemp.add(fl);
					if (l == zwPzfls.size() - 1) {
						htykj2Service.saveZwpzfl(zwPzflstemp);
						zwPzflstemp.clear();
					}
				}
				System.out.println("第" + k + "批的10000条结束");
			} else {
				System.out.println("第" + k + "批的10000条开始");
				for (int l = (k - 1) * 10000; l < k * 10000; l++) {
					ZwPzfl fl = zwPzfls.get(l);
					zwPzflstemp.add(fl);
					if (l == k * 10000 - 1) {
						htykj2Service.saveZwpzfl(zwPzflstemp);
						zwPzflstemp.clear();
					}

				}
				System.out.println("第" + k + "批的10000条结束");
			}
		}	

@Service层:

	public void saveZwpzfl(List pzflList) throws Exception{
		baseDao2Htykj.savePzflList(pzflList);
	}

@Dao层:

关键点:每一千条刷新并写入数据库  ,并清除seesion

	public void savePzflList(List list) {
		
		try {
			Session session = this.webSessionFactory.getCurrentSession();
			//Transaction tx= session.beginTransaction(); 
			 for (int i = 0; i < list.size(); i++) {
				 ZwPzfl pzflList = (ZwPzfl) list.get(i);
				 pzflList.getId();
//				 System.out.println("::::::::::::::::::这个分录的id::::::::::::::::::"+ pzflList.getId() );
//				 System.out.println(".......执行进度:::......"+i);
				 
	                session.save(list.get(i));
	                if(i%1000 == 0){   //每一千条刷新并写入数据库  
	                    session.flush();  
	                    session.clear();  
	                }
	                
	            }
			// session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			closeSession();
		}
		
	}

你可能感兴趣的:(java)