Почему метод DAO такой медленный в ORMLite?

У меня есть метод, который выглядит так

public Dao<ModelStore, Integer> getDaoStore() throws SQLException {
    return BaseDaoImpl.createDao(getConnectionSource(), ModelStore.class);
}

когда я звоню getDaoStore это довольно длительный процесс. В моем журнале я вижу, что GC запускается после каждого вызова, так что я предполагаю, что с этим вызовом многое происходит.

Есть ли способ ускорить это?

1 ответ

Решение

Глубокое изучение Android-земли показало, что из-за Method.equals() Метод, аннотации под Android очень медленные и чрезвычайно интенсивно работают с GC. Мы добавили файлы конфигурации таблиц в версии 4.26, которые обошли это и сделали запуск ORMLite намного, намного быстрее. Смотрите этот вопрос и эту ветку в списке рассылки.

Мы продолжаем улучшать скорость аннотаций. Смотрите также: ORMLite плохая производительность на Android?


Создание DAO - это относительно дорогой процесс. ORMLite создает представление данных как класса, так и полей в классе и создает ряд других служебных классов, которые помогают с различными функциями DAO. Вы должны убедиться, что вы звоните createDao метод один раз за вызов. Я предполагаю, что это под Android @Pzanno?

В 4.16 мы добавили DaoManager чья работа заключается в кэшировании классов Dao, и это было улучшено в версии 4.20. Затем вы всегда должны использовать его для создания своего Daos. Рекомендуется что-то вроде следующего кода:

private Dao<ModelStore, Integer> modelStoreDao = null;
...

public Dao<ModelStore, Integer> getDaoStore() throws SQLException {
    if (modelStoreDao == null) {
        modelStoreDao = DaoManager.createDao(getConnectionSource(),
            ModelStore.class);
    }
    return modelStoreDao;
}

Надеюсь это поможет. Аудит памяти ORMLite, вероятно, также в порядке. Прошло много времени с тех пор, как я посмотрел на потребление.

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