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