我是从一台服务器解析JSON,使用ORMLite因为我读出来坚持对象到数据库。 这些文件可以得到非常大的,所以我的想法是因为他们正在阅读将对象提交一次一个,而不是读取上百个对象到内存中,并做了质量承诺(内存为智能手机稀少,毕竟)。 然而,每个对象将包含多个值的集合(我尝试使用ForeignCollection
这些值,所以每个值需要被当作一个单独的对象),并认为这将是更好地犯的一个对象的集合中的所有项目一次,而不是承诺,说,每个个体字符串或整数。
我认为,做一团提交的批处理,我会简单地调用dao.setAutoCommit(false)
,调用dao.create()
对每个项目,调用dao.commit()
之后,然后调用dao.setAutoCommit(true)
回到零碎的提交。
我有三个问题:
- 那么,是否可以承诺,因为我去,或者我到一批应提交 - 即使这意味着高达上千元的对象会立即得到承诺?
- 它是更好地提交项目之一的集合的时间,或者在批处理?
- 我在哪里得到
databaseConnection
从该值dao.setAutoCommit()
和dao.commit()
要求? 也许我错过了,但文档或例子中我找不到它。
那么,是否可以承诺,因为我去,或者我到一批应提交 - 即使这意味着高达上千元的对象会立即得到承诺?
如果你有大量的项目可能会更好一次,而不是1000犯下了几个100个的对象。 这在很大程度上取决于所以用各种不同批量运行它,并定时他们将尝试好事对象的大小。 至于你提到,你需要平衡存储和数据库性能。 我很好奇的结果,所以请与您的时序数据的注释。
它是更好地提交项目之一的集合的时间,或者在批处理?
这当然是更好的做事情的一个批次。 这只是我工作过的每一个数据库的真实。
如果你是在谈论一个外国收集,然后真的是有对象的国外收集和要创建对象的大名单没有任何区别。 双方将受益于配料。
每个外部对象的创建后,我不会承诺。 我宁愿批量达100(比方说)外的物体和任何相关的异物他们。 然后提交了100的变化,做下100。然后改变100到200,然后尝试50,等等。你应该看到拐点。
难道我回答这个问题吧?
我在哪里得到的值的DatabaseConnection dao.setAutoCommit()
和dao.commit()
要求? 也许我错过了,但文档或例子中我找不到它。
编辑#2:
作为@Chad指出的,我错了采用Android下自动提交建议。 通过启动交易,完成后提交它虽然sqlite的驱动程序通常支持自动提交。 安卓似乎并不不过来支持这一点。 在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;
}
});