0

Je frappe ce qui me semble étrange comportement lorsque je tire des données de la banque de données google sur JDO. En particulier, la requête s'exécute rapidement (disons 100 ms), mais trouver la taille de la liste résultante <> prend environ une seconde! En effet, quelle que soit l'opération que j'essaie d'effectuer sur la liste résultante prend environ une seconde. Est-ce que quelqu'un a vu ce comportement? Est-ce prévu? Inhabituel? Un moyen de contourner cela?Google Datastore w/JDO: temps d'accès?

PersistenceManager pm = PMF.getPersistenceManager(); 
Query q = pm.newQuery("select from " + Person.class.getName()); 
System.out.println("getting all at " + System.currentTimeMillis()); 
mcs = (List<Person>) q.execute(); 
System.out.println("got all at " + System.currentTimeMillis()); 
int size = mcs.size(); 
System.out.println("size was " + size + " at " + System.currentTimeMillis()); 
obtenir tout à 1.271.549.139.441
a obtenu tout à 12715491
taille était de 850 à 12715491

-B

Répondre

1

appel à execute() exécute la requête , mais ne renvoie pas tous les résultats - les résultats sont récupérés en fonction des besoins lorsque vous accédez à la liste. L'appel de .size() nécessite que le magasin de données extrait et compte tous les résultats, ce qui est une opération très inefficace!

+0

Merci Nick. Pouvez-vous me montrer une ressource qui expliquera ce comportement plus en détail? En particulier, je suis curieux de savoir ce qui déclenche la communication aller-retour au serveur de base de données, et ce qui est effectué localement. – Bosh

+0

En outre, l'implication est-elle vraiment qu'il faut un 1.6 SECONDES complet pour aller chercher 850 lignes dans une très petite table? – Bosh

+0

Malheureusement, je ne suis pas au courant de toute la documentation actuelle qui va dans les détails sur la façon dont JDO ou JPA font des appels de base de données. En ce qui concerne l'exécution, cela dépend fortement de votre modèle (sa taille et du nombre de champs), car le temps de désérialisation peut facilement dépasser le temps d'aller-retour de la base de données. En outre, le temps nécessaire pour exécuter une requête ne dépend pas de la taille de votre table, mais uniquement de la taille de l'ensemble de résultats. Vous devriez généralement structurer votre application afin qu'elle ne récupère que les résultats que l'utilisateur verra. –

Questions connexes