1. 程式人生 > >Hibernate入門 批量插入資料

Hibernate入門 批量插入資料

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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>//關閉二級快取 


 

 

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述