hibernate插入100万条数据的性能

共插入1000000条,使用时间:24190172ms

 

约花费等于6小时40分,几乎从上班开始一直运行到下班结束!!

 

 

============================================

可能需要优化的地方

1、程序设置累计1000条时,往数据库插入数据。可以改为10000条。

 

 if(i%1000==0){

        session.flush();

        session.clear();

       

System.out.println("已插入"+i+"条,\t 进度:"+nt.format((double)i/(double)count));

       }

 

2、使用jdbc的批处理

 

3、在插入数据过程中,如果有连接对该表进行查询。则一次插入1000条数据竟然要4-5分钟,停止对该表的查询后,插入数据速度提升

 

4、为了防止一次失败导致全部失败的回滚操作。可以把100万条数据平均分成10,然后一次导入10万条以降低风险

 

5、就总结上面4条么 ?还有呢?

 

 

程序代码如下:

 

package com.gwideal.college.sitesearch.test;

import java.text.NumberFormat;
import java.util.Date;

import org.hibernate.CacheMode;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.gwideal.article.entity.Article;
import com.gwideal.cms.entity.CmsChannel;
import com.gwideal.cms.entity.CmsConfig;
import com.gwideal.cms.entity.ContentCtg;
import com.gwideal.college.sitesearch.lucene.LuceneCreateDocument;
import com.gwideal.college.sitesearch.util.HibernateUtil;
import com.gwideal.core.entity.Website;

public class AddData { 
	
	public static void main(String[] args) {
		
	     NumberFormat nt = NumberFormat.getPercentInstance();
		 nt.setMinimumFractionDigits(2);
		long start=System.currentTimeMillis();
		Session session =HibernateUtil.currentSession(); 
		Transaction tx =session.beginTransaction();
		int count=1000000;
		for(int i=0;i<count;i++){
		  Article article=new Article();
		  article.setAuthor("kevin");
		  article.setTitle("kevin_test_"+i);
		  article.setContent("" +
		  		"发展规划  按照规划,工程将分二期进行。   轨道交通13号线工程是上海市城市轨道交通路网规划中的一" +
		  		"条纵贯中心城区的“西北——东南”轴向的直径线,也是轨道交通路网中的一条重要的主干线。   " +
		  		"轨道交通13号线一期工程线路正线全长为全长16.4公里,起点为金运路站,经金沙江西路、金沙江路、长寿路" +
		  		"、天目西路、恒丰路、大田路、石门路,到达一期工程终点南京西路站。线路途经上海市嘉定、普陀、闸北、静安4" +
		  		"个行政管辖区。   轨道交通13号线一期工程共设14座车站,沿线与1、2、3、4、7、11、12号线及规划中的14、15、2" +
		  		"0、21共11条线、9座站换乘,其中三线换乘站3座,两线换乘站6座,全部为地下站,分别是金运路站、江桥站、丰庄站、祁" +
		  		"连山南站、真北路站、大渡河路站、金沙江路站(与3、4号线换乘)、隆德路站(与11号线换乘)、武宁路站、长寿路站(与7号" 
		  		+
		  		"线换乘)、江宁路站、汉中路站(与1号线、12号线换乘)、自然博物馆站、南京西路站(与2号线、12号线换乘)。   轨道交通" +
		  		"13号线一期工程设北翟路车辆基地1座(与2号线共享),设控制中心1座(与11号线共享)和变电所1座(与11号线共享),轨" +
		  		"道交通13号线一期西段(工程将于2012年年底首先开通)。   轨道交通13号线一期工程在2012年建成以后,将与同年建成的" +
		  		"11号线北段二期和12号线一起,形成总共13条线、237座车站、总长500公里运营里程的上海轨道交通基本网络,每天可接纳近8" +
		  		"00万人次,占全市公交出行总量的40%以上,大大方便了市民的交通出行,从而使上海的轨道交通跨入世界先进行列。   二期" +
		  		"由南京西路站延伸至张江路站,现阶段有消息指出计划于2015年左右开通。   横穿上海市中心   13号线是上海市城市轨道" +
		  		"交通路网中西北-东南的重要骨干线路,穿越嘉定、普陀、静安、闸北、再次来到静安、黄浦、和浦东新区等8个行政区,经过金鹤" +
		  		"公路、金沙江路、长寿路、天目西路、恒丰路、石门路、瑞金路、成山路、沪南路等客运交通走廊和大型客流集散点,串联城市总体规划" +
		  		"中的几个中心,如长风地区、华阳社区、江宁社区、不夜城综合开发区、太平桥二期和部分历史文化风貌保护区、世博会地区以及浦东的三" +
		  		"林、六里地区。   13号线全长33.6公里,均为地下线。31座车站分别为金运路站(换乘20号线)、江桥站、丰庄站、祁连山南路站(换乘" +
		  		"21号线)、真北路站、大渡河路站(换乘15号线)、金沙江路站(换乘3、4号线)、隆德路站(换乘11号线)、武宁路站(换乘14号线)、长寿" +
		  		"路站(换乘7号线)、江宁路站、汉中路站(换乘1号线、12号线)、自然博物馆站、 南京西路站(换乘2号线、12号线)、淮海中路站(换成14号" +
		  		"线)、新天地站(换乘10号线)、马当路站(换乘9号线)、卢浦大桥站、世博大道站、长清路站(换乘7号线)、成山路站(换乘8号线)、东明" +
		  		"路站(换乘6号线)、六里站、下南路站、北蔡站、绿川新村站、莲溪路站(换乘18号线)、华夏中路站(换乘16号线、中科路站、哥白尼路站和" +
		  		"张江路站,均为地下站。   据环评报告透露,13号线将分段修建,预计全线工程总投资为198.68亿元,2012年底将完成金运路站至金沙江路站" +
		  		"线路,设车站7座;2015年后年完成金沙江路路站至南京西路路站线路,再完成南京西路站至以张江路站。   世博专用线   十三号线其中三个" +
		  		"车站(卢浦大桥、世博园、长清路)三个全长约5公里的地铁隧道区间,属于2010年世界博览会的「世博专用线」(或称「" +
		  		"世博过江段」),计划2010年初提早投入运营,以便开幕前建成启用,作为世博园内专用轨道交通。在世博会期间此段线路" +
		  		"将不纳入轨道交通运营网络,而是凭世博会门票免费乘坐。 此区间由上海建工(集团)总公司于2007年3月以13.38亿元人民币" +
		  		"的投得建设权;工程竣工并试运营一年后,则会由招标人回购。   建设(规划)中换乘车站   金运路站 - 与二十号线换" +
		  		"乘   祁连山南路站 - 与二十一号线换乘   大渡河路站 - 与十五号线换乘   金沙江路站 - 与三号线及四号线换乘   隆" +
		  		"德路站 - 与十一号线换乘   武宁路站 - 与十四号线换乘   长寿路站 - 与七号线换乘   汉中路站 - 与一号线及十二号线换" +
		  		"乘   南京西路站 - 与二号线及十二号线换乘   淮海中路站 - 与十四号线换乘   新天地站 - 与十号线换乘   " +
		  		"马当路站 - 与九号线换乘   长清路站 - 与七号线换乘   成山路站 - 与八号线换乘   东明路站 - 与六号线换乘 " +
		  		"  莲溪路站 - 与十八号线换乘   华夏中路站 - 与十六号线换乘   轨道交通十三号线一期将于2012年12月28日试运" +
		  		"营,率先开通金运路站至金沙江路区间试运行   金沙江西路站   丰庄站   祁连山南路站(暂不开通,预计2013年开通)" +
		  		"   真北路站   大渡河路站(暂不开通,预计2014年开通)   金沙江路站(可换成3、4号线) " +
		  		
		  		"");
		  
		        CmsChannel channel=new CmsChannel();
		        channel.setId(1083l);
		        article.setChannel(channel);
		        article.setTplContent("/article/default/content_gg.html");
		        article.setSortDate(new Date());
		        article.setReleaseDate(new Date());
		        article.setReleaseSysDate(new Date());
		        article.setVisitTotal(1000l);
		        article.setVisitMonth(1000l);
		        article.setVisitToday(1000l);
		        article.setVisitWeek(1000l);
		        article.setVisitYear(1000l);
		        article.setVisitQuarter(1000l);
		        
		        article.setCheck(true);
		        article.setBold(false);
		        article.setCheckOpinion("1");
		        article.setCheckTime(new Date());
		        article.setCommentCount(3);
		        article.setCheckStep(2);
		        Website website=new Website();
		        website.setId(1l);
		        article.setWebsite(website);
		        CmsConfig config=new CmsConfig();
		        config.setId(1l);
		        article.setConfig(config);
		        
		        ContentCtg contentCtg=new ContentCtg();
		        contentCtg.setId(1l);
		        article.setContentCtg(contentCtg);
		        
		        article.setTopLevel(1);
		        
		       article.setHasTitleImg(false);
		       
		       article.setAllowComment(true);
		      article.setDraft(false);
		      article.setBold(false);
		      article.setRecommend(false);
		      article.setDisabled(false);
		      article.setReject(false);
		      article.setPageCount(10);
		      article.setStatDate(new Date());
		      
		        session.save(article);
		         
		        if(i%1000==0){
		        	session.flush();
		        	session.clear();
		        	
		           System.out.println("已插入"+i+"条,\t 进度:"+nt.format((double)i/(double)count));
		        }
		}   
		tx.commit();
		long end=System.currentTimeMillis();
		System.out.println("共插入"+count+"条,使用时间:"+(end-start)+"ms");
		HibernateUtil.closeSession() ;  
		        
	}

}
 

 

 

 

 

 

猜你喜欢

转载自zhouchaofei2010.iteye.com/blog/1755148