9

在我的应用程序中调用 ORMLiteRuntimeExceptionDaocreateOrUpdate(...)方法非常慢。

我有一个非常简单的对象 ( Item),它有 2 个整数(一个是generatedId)、aString和 a double。我用下面的代码测试了(大致)更新数据库中的对象(100 次)所需的时间。日志语句记录:

更新 1 行 100 次的时间: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. 它记录"Loaded configuration for class ...Item"所以这不是问题。

谢谢。

4

1 回答 1

24

不幸的是,这可能是“预期”的速度。确保您使用的是 ORMLite 4.39 或更高版本。 createOrUpdate(...)正在使用一种更昂贵的方法来预先测试数据库中对象的存在。但我怀疑这将是最小的速度改进。

如果我创建 100 个新行,那么速度会更慢。

默认情况下,Sqlite 处于自动提交模式。要尝试的一件事是使用ORMLite方法包装您的插入(或您createOrUpdate的 s) 。 Dao.callBatchTasks(...)

BulkInsertsTest android 单元测试中,以下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 秒。

于 2012-08-01T15:05:09.107 回答