java批量插入資料進資料庫中

來源:互聯網
上載者:User

標籤:約束   declare   備份   內容   變數   全表掃描   啟動   串列   .exe   

方式1:

for迴圈,每一次進行一次插入資料。

 

方式2:

jdbc的preparedStatement的batch操作

PreparedStatement.addBatch();......PreparedStatement.executeBatch();

一次最多不要超過50條:
1.因為當你插入的時候 資料庫已經鎖定,然而如果你一次性插入太多會造成其他業務的等待。
2.會造成記憶體的溢出

方式2的本質是:insert into table (a,b,c,d) values(av,bv,cv.dv);insert into table (a,b,c,d) values(...)...

 

方式3:

for迴圈拼接sql。成為insert into table (a,b,c,d) values (av,bv,cv,dv),(....),(...).這種形式

 

 

別人的經驗之談:

  最近項目中使用SSH+oracle資料庫,使用C3P0串連池,要求當執行某動作時在2表中各插入一萬條資料。於是就採用了jdbc的方式插入。     先擷取一個sequence,再將資料插入到資料庫中。一測試時間,崩潰了,用時近3分鐘(其中擷取兩個表的sequence很費時),後來想想以前曾經做過一個類似的項目,使用了主鍵自增的策略,就將主鍵改為自增了。再次測試,還可以,不到3秒。將此代碼記錄下來,以便日後參考。     順便說說,可以使用預存程序(尤其是操作多個表插資料),這樣效率更快些。 

 

 

這篇文章也不錯:

這篇論壇文章根據筆者的個人經驗著重介紹了使用insert插入大量資料的常用技巧,更多內容請參考下文: 使用insert插入大量資料的個人經驗總結在很多時候,我們會需要對一個表進行插入大量的資料,並且希望在儘可能短的時間內完成該工作,這裡,和大家分享下我平時在做大量資料insert的一些經驗。 前提:在做insert資料之前,如果是非生產環境,請將表的索引和約束去掉,待insert完成後再建索引和約束。1.insert into tab1 select * from tab2;commit;這是最基礎的insert語句,我們把tab2表中的資料insert到tab1表中。根據經驗,千萬級的資料可在1小時內完成。但是該方法產生的arch會非常快,需要關注歸檔的產生量,及時啟動備份軟體,避免arch目錄撐爆。2.alter table tab1 nologging;insert /*+ append */ into tab1 select * from tab2;commit;alter table tab1 logging;該方法會使得產生arch大大減少,並且在一定程度上提高時間,根據經驗,千萬級的資料可在45分鐘內完成。但是請注意,該方法適合單進程的串列方式,如果當有多個進程同時運行時,後發起的進程會有enqueue的等待。注意此方法千萬不能dataguard上用(不過要是在database已經force logging那也是不怕的,呵呵)!!3.insert into tab1 select /*+ parallel */ * from tab2;commit;對於select之後的語句是全表掃描的情況,我們可以加parallel的hint來提高其並發,這裡需要注意的是最大並發度受到初始化參數parallel_max_servers的限制,並發的進程可以通過v$px_session查看,或者ps -ef |grep ora_p查看。4.alter session enable parallel dml;insert /*+ parallel */ into tab1 select * from tab2;commit;與方法2相反,並發的insert,尚未比較和方法2哪個效率更高(偶估計是方法2快),有測試過的朋友歡迎補充。5.insert into tab1 select * from tab2 partition (p1);insert into tab1 select * from tab2 partition (p2);insert into tab1 select * from tab2 partition (p3);insert into tab1 select * from tab2 partition (p4);對於分區表可以利用tab1進行多個進程的並發insert,分區越多,可以啟動的進程越多。我曾經試過insert 2.6億行記錄的一個表,8個分區,8個進程,如果用方法2,單個進程完成可能要40分鐘,但是由於是有8個分區8個進程,後發進程有enqueue,所以因此需要的時間為40分鐘×8;但是如果用方法5,雖然單個進程需要110分鐘,但是由於能夠並發進程執行,所以總共需要的時間就約為110分鐘了。6. DECLARETYPE dtarray IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;v_col1 dtarray;v_col2 dtarray;v_col3 dtarray;BEGINSELECT col1, col2, col3 BULK COLLECTINTO v_col1, v_col2, v_col3FROM tab2;FORALL i IN 1 .. v_col1.COUNTinsert into tab1....;END;用大量繫結(bulk binding)的方式。當迴圈執行一個綁定變數的sql語句時候,在PL/SQL 和SQL引擎(engines)中,會發生大量的環境切換(context switches)。使用bulk binding,能將資料批量的從plsql引擎傳到sql引擎,從而減少環境切換過程,提升效率。該方法比較適合於線上處理,不必停機。7.sqlplus -s user/pwd< runlog.txtset copycommit 2;set arraysize 5000;copy from user/[email protected] -to user/[email protected] -insert tab1 using select * from tab2;exitEOF用copy的方法進行插入,注意此處insert沒有into關鍵字。該方法的好處是可以設定copycommit和arrarysize來一起控制commit的頻率,上面的方法是每10000行commit一次。

來自:http://freebile.blog.51cto.com/447744/587120/

 

java批量插入資料進資料庫中

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.