使用Hibernate将csv文件导入MySQL数据库

时间:2014-09-01 08:10:53

标签: java mysql hibernate csv groovy

我正在尝试将csv文件导入MySQL数据库,并且我使用Hibernate在groovy中创建了一个脚本。问题是,csv文件非常庞大,它有大约4800万行。我正在打开一个会话并为每一行提交一个事务,但后来我发现这需要很长时间。根据运行脚本一天后添加到数据库的行的速度,导出所有内容需要一个多月。所以,我想也许,瓶颈在于打开一个会话并为每一行提交一个事务......然后我决定只打开一个会话,读取每一行,为每一行实例化一个实体,将其保存在会话中,在读完所有4800万行并在会话中存储4800万个实体后,提交一个包含所有这些实例的单个事务。好吧,那也没办法。有没有办法以更快的方式将此csv文件导入mysql数据库?或者它应该花那么长时间?

3 个答案:

答案 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/