在我的应用程序中调用 ORMLite RuntimeExceptionDao
的 createOrUpdate(...)
方法非常慢。
我有一个非常简单的对象 (Item
),带有 2 个整数(一个是 generatedId
)、一个 String
和一个 双
。我使用下面的代码测试(粗略地)更新数据库中的对象(100 次)所花费的时间。日志语句记录:
time to update 1 row 100 times: 3069
为什么在只有 1 行的表中更新对象 100 次需要 3 秒。这是正常的 ORMLite 速度吗?如果不是,可能是什么问题?
RuntimeExceptionDao<Item, Integer> dao =
DatabaseManager.getInstance().getHelper().getReadingStateDao();
Item item = new Item();
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
item.setViewMode(i);
dao.createOrUpdate(item);
}
long update = System.currentTimeMillis();
Log.v(TAG, "time to update 1 row 100 times: " + (update - start));
如果我创建 100 个新行,那么速度会更慢。
注意:我已经在使用 ormlite_config.txt
。它记录 “类的加载配置 ...Item”
所以这不是问题。
谢谢。
最佳答案
不幸的是,这可能是“预期”的速度。确保您使用的是 ORMLite 4.39 或更高版本。 createOrUpdate(...)
使用了一种更昂贵的方法来预先测试数据库中对象的存在。但我怀疑这将是一个最小的速度改进。
If I create 100 new rows then the speed is even slower.
默认情况下,Sqlite 处于自动提交模式。可以尝试的一件事是使用 ORMLite 包装您的插入内容(或您的 createOrUpdate
) Dao.callBatchTasks(...)
方法。
在BulkInsertsTest android unit test ,下面的 doInserts(...)
方法插入 1000 个项目。当我调用它时:
doInserts(dao);
在我的模拟器中需要 7.3 秒。如果我使用 callBatchTasks(...)
方法调用,该方法在 Android Sqlite 中围绕调用包装事务:
dao.callBatchTasks(new Callable<Void>() {
public Void call() throws Exception {
doInserts(dao);
return null;
}
});
需要 1.6 秒。使用 dao.setSavePoint(...)
方法可以获得相同的性能。这会启动一个事务,但不如 callBachTasks(...)
方法好,因为您必须确保关闭自己的事务:
DatabaseConnection conn = dao.startThreadConnection();
Savepoint savePoint = null;
try {
savePoint = conn.setSavePoint(null);
doInserts(dao);
} finally {
// commit at the end
conn.commit(savePoint);
dao.endThreadConnection(conn);
}
这也需要大约 1.7 秒。
关于android - ORMLite 创建或更新似乎很慢 - 正常速度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11761472/