Hibernate入門 批量插入資料
阿新 • • 發佈:2018-11-11
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
一般如果要插入100萬條資料,則會寫如下程式碼:
package org.xiazdong.test;import junit.framework.TestCase;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;import org.xiazdong.Person;public class PersonTest extends TestCase{ @Test public void testAdd(){ long begin = System.currentTimeMillis(); Configuration config = new Configuration(); config.configure(); SessionFactory factory = config.buildSessionFactory(); Session session = factory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<1000000; i++ ) { //插入100萬條資料 Person person = new Person("xiazdong-"+i,i+20); session.save(person); } tx.commit(); session.close(); long end = System.currentTimeMillis(); System.out.println((end-begin)/1000.0); }}
此程式正常來說是會報錯:
這是因為Hibernate預設會把沒有提交的資料全部快取,但是快取是不能存入100萬條資料的,因此會報錯,我們怎麼樣能夠解決呢?
我們可以通過每100個insert語句時,就強制刷入資料庫,實現程式碼如下:
package org.xiazdong.test;import junit.framework.TestCase;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;import org.xiazdong.Person;public class PersonTest extends TestCase{ @Test public void testAdd(){ long begin = System.currentTimeMillis(); Configuration config = new Configuration(); config.configure(); SessionFactory factory = config.buildSessionFactory(); Session session = factory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<1000000; i++ ) { //插入100萬條資料 Person person = new Person("xiazdong-"+i,i+20); session.save(person); if(i%100==0){ //每一千條重新整理並寫入資料庫 session.flush(); session.clear(); } } tx.commit(); session.close(); long end = System.currentTimeMillis(); System.out.println((end-begin)/1000.0); }}
經過測試,花費時間為:148秒;
注:如果資料庫在程式執行過程中記錄數為0,是因為資料庫為read commited,事務提交之後才能夠資料。
當然,同樣可以使用Hibernate配置來實現同樣功能:
在hibernate.cfg.xml中插入:
<property name="hibernate.jdbc.batch_size">50</property>//每50條語句提交一次 <property name="hiberante.cache.use_second_level_cache">false</property>//關閉二級快取