如何使用Dao.setAutoCommit()?

时间:2012-05-10 21:27:42

标签: android ormlite

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

我相信要批量制作一组提交,我只需致电dao.setAutoCommit(false),为每件商品致电dao.create(),然后致电dao.commit(),然后致电{{1}回到零碎的提交。

我有三个问题:

  1. 我去的时候提交是否正确,或者我应该批量提交 - 即使这意味着最多可以同时提交一千个对象吗?
  2. 最好一次提交一个项目集合,还是批量提交?
  3. 我从哪里获得dao.setAutoCommit(true)databaseConnection要求的dao.setAutoCommit()值?也许我错过了,但我在文档或示例中找不到它。

1 个答案:

答案 0 :(得分:2)

  

在我去的时候提交是否正确,或者我应该批量提交 - 即使这意味着一次会有多达一千个对象被提交?

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

  

一次提交一个项目集合或批量提交是否更好?

当然更好地批量处理。对于我曾经工作的几乎所有数据库都是如此。

如果您正在谈论外国集合,那么外国对象集合与您要创建的大量对象之间实际上没有区别。两者都将受益于批处理。

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

我答应了这个吗?

  

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

编辑#2:

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

在Android下,使用ORMLite执行批处理任务的正确方法是使用dao.callBatchTasks(Callable) method代替。类似的东西:

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;
    }
});