2011-03-24 2 views
4

J'ai une méthode qui ressemble à ceciPourquoi la méthode DAO est-elle si lente dans ORMLite?

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

quand je l'appelle getDaoStore est un processus assez long. Dans mes journaux, je peux voir que le GC fonctionne après chaque appel, donc je suppose qu'il se passe beaucoup de choses avec cet appel.

Y at-il un moyen d'accélérer cela?

+0

Que retourne cet appel? Des milliers d'objets de la base de données? Dans ce cas, vous devez limiter la quantité de données chargées à partir de la base de données. – Gamlor

+0

@Gamlor Cet appel renvoie un objet DAO qui va agir sur un modèle donné pour diverses tâches de base de données, telles que l'insertion, la mise à jour, la requête, etc ... – Pzanno

+0

Hey @Pzanno. J'ai mis à jour ma réponse ci-dessous avec la vraie raison pour laquelle le 'createDao' est si lent sous Android. – Gray

Répondre

8

Un examen approfondi de la terre Android a révélé qu'en raison d'une méthode Method.equals() brute, les annotations sous Android sont très lent et extrêmement GC intensive. Nous avons ajouté des fichiers de configuration de table dans la version 4.26 qui contournent cela et font démarrer ORMLite beaucoup plus rapidement. Voir this question et this thread sur la liste de diffusion.

Nous continuons d'améliorer les vitesses d'annotation. Voir aussi: ORMLite poor performance on Android?


création de DAO est un processus relativement coûteux. ORMLite crée une représentation de données de la classe et des champs de la classe et génère un certain nombre d'autres classes d'utilitaire qui aident avec les différentes fonctionnalités DAO. Vous devez vous assurer que vous appelez la méthode createDao une fois par appel. Je suppose que c'est sous Android @Pzanno?

Dans 4.16 nous avons ajouté un DaoManager dont le travail est de mettre en cache les classes Dao et cela a été amélioré dans la version 4.20. Vous devriez alors toujours l'utiliser pour créer votre Daos. Quelque chose comme le code suivant est recommandé:

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

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

Espérons que cela aide. Un audit de la mémoire d'ORMLite est probablement aussi dans l'ordre. Cela fait un moment que j'ai regardé sa consommation.

+0

@Gray Merci! Maintenant, dans votre exemple, vous cachez également le dao en tant que membre privé d'une classe. Est-ce nécessaire puisque vous avez dit que le DaoManager le mettra en cache pour vous? – Pzanno

+0

@Gray Aussi, s'il est préférable de me mettre en cache, recommanderiez-vous de faire une variable statique? ou cela consomme-t-il trop de mémoire? – Pzanno

+0

@Gray Je viens de tester la nouvelle classe DaoManager de 4.16 et je ne peux pas dire que j'ai remarqué la mise en cache qu'elle est censée faire. Aussi dans mes journaux Android je suis en train d'en imprimer un tas '03-25 15: 21: 33.022: INFO/dalvikvm (8157): Impossible de trouver la méthode java.sql.SQLException. , référencé à partir de la méthode com.j256.ormlite.dao.DaoManager.createDao 'lors de la création de tables avec la classe TableUtils. – Pzanno

Questions connexes