2014-09-01 126 views
1

我想導入一個csv文件到MySQL數據庫,並且我在groovy中使用Hibernate創建了一個腳本。事情是,csv文件非常龐大,大約有四千八百萬行。我打開一個會話併爲每一行提交一個交易,但後來我發現這需要很長時間。在運行腳本一天後,通過添加到數據庫的行速度,需要一個多月才能導出所有內容。所以,我想也許,瓶頸在於打開一個會話併爲每一行提交事務......然後我決定打開一個會話,讀取每一行,爲每一行實例化一個實體,將它保存在會話中,在讀完所有4800萬行並在會話中存儲4800萬個實體之後,對所有這些實例進行單個事務處理。那也不管用。有沒有辦法以更快的方式將這個csv文件導入到mysql數據庫?或者它應該真的需要那麼長時間?使用休眠導入csv文件到MySQL數據庫

+0

您的意思是進口? – 2014-09-01 08:15:31

+0

是「從mysql導出」還是「導入到mysql」? – cfrick 2014-09-01 08:15:36

+0

我不知道如何做到這一點與休眠,但你可以很容易地導入一個csv文件到MySQL與加載數據infile http://stackoverflow.com/questions/14127529/mysql-import-data-from-csv-using -load-data-infile – luanjot 2014-09-01 08:18:38

回答

2

在腳本中休眠?你一定在開玩笑! :)

我會堅持groovy.sql.Sql,因爲它使用簡單靈活,並沒有hibernate的負擔與映射或會話刷新。

腳本可能會尋找如下:

Sql db = new Sql(...) 
int flushCounter = 0 
new File('my.csv').splitEachLine(/;/){ parts -> // or a full-blown csv-parser here 
    db.executeInsert 'insert into mytable (id,a,b,c) values (null,?,?,?)', parts 
    flushCounter++ 
    if(0 == flushCounter % 1000) db.commit() // flush each 1000 records 
} 
db.commit() 
db.close()