CreateOrUpdate в ORMLite кажется медленным - что такое нормальная скорость?

Вызов ORMLite RuntimeExceptionDao"s createOrUpdate(...) Метод в моем приложении очень медленный.

У меня очень простой объект (Item) с 2-х дюймов (один является generatedId), String и double, Я проверяю время (примерно), чтобы обновить объект в базе данных (100 раз) с помощью приведенного ниже кода. Оператор журнала регистрирует:

время обновить 1 строку 100 раз: 3069

Почему требуется 100 секунд, чтобы обновить объект 100 раз, в таблице только с 1 строкой. Это нормальная скорость 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" так что это не проблема.

Благодарю.

1 ответ

Решение

Это может быть "ожидаемая" скорость, к сожалению. Убедитесь, что вы используете ORMLite версии 4.39 или выше. createOrUpdate(...) раньше использовал более дорогой метод для проверки наличия объекта в базе данных. Но я подозреваю, что это будет минимальное улучшение скорости.

Если я создаю 100 новых строк, то скорость будет еще медленнее.

По умолчанию Sqlite находится в режиме автоматической фиксации. Одна вещь, чтобы попробовать, это обернуть ваши вкладыши (или ваш createOrUpdates) использование ORMLite 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 секунды.

Другие вопросы по тегам