【问题标题】:Slow batch import with in-memory H2 database使用内存 H2 数据库进行慢速批量导入
【发布时间】:2012-03-07 12:06:59
【问题描述】:

我有一个具有五个属性的域类,它们都是字符串、整数或双精度数。我正在使用 H2 内存数据库作为我的这个域类的数据源。这是存储在此数据库中的唯一对象;其余的存储在一个完全独立的 MySQL 数据库中。

H2 数据库是临时的。每小时从远程下载的 CSV 文件加载数据,并替换数据库中的旧数据。因为所有其他进程都必须等待它完成,所以尽可能快很重要。

现在我的代码生成一个包含大约 6,000 个这些域对象的数组,然后为每个 saves 生成一个数组。这一切都在withTransaction 中。

保存大约需要 10 秒。使用 HSQLDB 内存数据源时,数字会稍差一些。我已经尝试按照有关刷新会话等的说明进行操作,但这些只会增加所需的时间。

加快这 6,000 个对象的批量插入的最佳解决方案是什么?放弃 GORM 直接写 SQL 插入语句会不会快很多?

// data is an array of about 6,000 domain objects
data.each { item ->
    item.save()
}

【问题讨论】:

    标签: hibernate grails h2


    【解决方案1】:

    CSV import 是一个非常重要的用例。 H2 支持快速 CSV 导入。这很可能比使用工具时更快。

    您说的是“远程下载的 CSV 文件”。是临时文件吗?如果是,您可以使用文件中的 CSV 导入。最快的方法是

    CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))
    AS SELECT * FROM CSVREAD('test.csv');
    

    这比先创建表再插入要快。它也比使用批量插入更快。

    如果您没有文件而只有输入流,您可以直接使用 CSV 工具,使用new Csv().read(Reader r),然后从那里读取行并将它们插入数据库。

    当然,您可以尝试通过分析找出瓶颈所在。您可以使用自己的分析器,也可以使用 H2 的内置分析器。另请参阅 H2 文档中的 Application Profiling

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多