我正在从服务器解析JSON,使用ORMLite在我读出它们时将对象持久化到数据库。文件可能变得非常大,所以我的想法是在读取时一次一个地提交对象,而不是将数百个对象读入内存并进行大规模提交(毕竟智能手机上的内存很少)。但是,每个对象将包含一个具有多个值的集合(我试图对这些值使用ForeignCollection
,因此每个值都需要被视为一个单独的对象)并认为最好提交所有项目一个对象的集合,而不是提交,例如,每个单独的字符串或整数。
我相信要批量制作一组提交,我只需致电dao.setAutoCommit(false)
,为每件商品致电dao.create()
,然后致电dao.commit()
,然后致电{{1}回到零碎的提交。
我有三个问题:
dao.setAutoCommit(true)
和databaseConnection
要求的dao.setAutoCommit()
值?也许我错过了,但我在文档或示例中找不到它。答案 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;
}
});