2014-09-01 134 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()