Почему метод DAO такой медленный в ORMLite? - PullRequest
4 голосов
/ 24 марта 2011

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

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

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

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

1 Ответ

8 голосов
/ 25 марта 2011

Глубокое изучение Android-земли показало, что из-за грубого метода Method.equals() аннотации под Android являются очень медленными и чрезвычайно ГХ интенсивными.Мы добавили файлы конфигурации таблицы в версии 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, вероятно, также в порядке.Прошло много времени с тех пор, как я посмотрел на его потребление.

...