我正在尝试将csv文件导入MySQL数据库,并且我使用Hibernate在groovy中创建了一个脚本。问题是,csv文件非常庞大,它有大约4800万行。我正在打开一个会话并为每一行提交一个事务,但后来我发现这需要很长时间。根据运行脚本一天后添加到数据库的行的速度,导出所有内容需要一个多月。所以,我想也许,瓶颈在于打开一个会话并为每一行提交一个事务......然后我决定只打开一个会话,读取每一行,为每一行实例化一个实体,将其保存在会话中,在读完所有4800万行并在会话中存储4800万个实体后,提交一个包含所有这些实例的单个事务。好吧,那也没办法。有没有办法以更快的方式将此csv文件导入mysql数据库?或者它应该花那么长时间?
答案 0 :(得分:3)
我建议您不要使用Java并使用LOAD DATA INFILE 'c:/tmp/discounts.csv' ...
请参阅http://www.mysqltutorial.org/import-csv-file-mysql-table/
答案 1 :(得分:2)
脚本中的Hibernate?你一定在开玩笑! :)
我会坚持使用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()
答案 2 :(得分:1)
我找到了解决问题的非常有趣的链接。也许它会很有用 http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/