0

我正在从服务器解析 JSON,在读取对象时使用 ORMLite 将对象持久保存到数据库中。这些文件可能会变得非常大,所以我的想法是在读取对象时一次提交一个对象,而不是将数百个对象读入内存并进行大规模提交(毕竟智能手机上的内存稀缺)。但是,每个对象都将包含一个具有多个值的集合(我试图将ForeignCollection这些值用于这些值,因此每个值都需要被视为一个单独的对象)并且认为最好一次提交对象集合中的所有项目,而不是提交每个单独的字符串或整数。

我相信要批量进行一组提交,我只需调用dao.setAutoCommit(false)dao.create()为每个项目调用dao.commit(),然后调用,然后调用dao.setAutoCommit(true)返回到零碎的提交。

我有三个问题:

  1. 提交是正确的,还是应该批量提交——即使这意味着一次提交多达一千个对象?
  2. 是一次提交一个项目的集合,还是批量提交项目集合?
  3. 我从哪里获得databaseConnection价值dao.setAutoCommit()dao.commit()要求?也许我错过了它,但我在文档或示例中找不到它。
4

1 回答 1

2

提交是正确的,还是应该批量提交——即使这意味着一次提交多达一千个对象?

如果您有大量项目,最好一次提交几个 100 个对象而不是 1000 个。这在很大程度上取决于对象的大小,因此以各种不同的批量大小运行它并对它们进行计时将是一件好事。正如您所提到的,您需要平衡内存和数据库性能。我会对结果感到好奇,所以请用您的时间数据发表评论。

是一次提交一个项目的集合,还是批量提交项目集合?

分批做事当然更好。这对我曾经工作过的几乎每个数据库都是如此。

如果您谈论的是外部集合,那么外部对象集合与您要创建的大量对象列表之间实际上没有区别。两者都将从批处理中受益。

在创建每个外部对象后,我不会提交。我宁愿批量处理 100 个(比方说)外部对象以及它们拥有的任何相关外部对象。然后提交 100 的更改并执行下一个 100。然后将 100 更改为 200,然后尝试 50,等等。您应该看到拐点。

我回答对了吗?

我从哪里获得 databaseConnection 值dao.setAutoCommit()dao.commit()要求?也许我错过了它,但我在文档或示例中找不到它。

编辑#2:

正如@Chad 指出的那样,我在Android 下推荐使用自动提交是错误的。尽管 Sqlite 驱动程序通常通过启动事务并在完成后提交来支持自动提交。然而,Android 似乎并不支持这一点。在 Android 数据库连接中,代码是无操作的。

在 Android 下,使用 ORMLite 执行批处理任务的正确方法是使用该dao.callBatchTasks(Callable)方法。就像是:

accountDao.callBatchTasks(connectionSource,
  new Callable<Void>() {
    public Void call() throws SQLException {
        // insert a number of accounts at once
        for (Account account : accountsToInsert) {
           // update our account object
           accountDao.create(account);
        }
        return null;
    }
});
于 2012-05-10T21:34:51.750 回答