2010-03-23 4 views
2

Je comprends le compteur sharded, ici: http://code.google.com/appengine/articles/sharding_counters.html Le problème est qu'un simple compteur ne fonctionnera pas dans mon application. Je suis en train de trier mes entités par une variable particulière, donc je suis renvoyé non pas tellement comme un compte, mais plutôt comme un rang. Ma méthode actuelle est:Java App Engine - compteur classé

SELECT COUNT(this) FROM Entity.class WHERE value <= ? 

Résultat + 1 est alors le rang du paramètre par rapport à la variable de valeur dans les objets persistants entité. La limite de ceci est le plus haut rang retourné est 1001 parce que count() peut donner un maximum de 1000. La raison pour laquelle je ne peux pas stocker le rang sur l'objet Entity est que les rangs sont mis à jour très souvent, et re-réglage variable serait beaucoup trop coûteux.

Des idées sur la meilleure façon d'y parvenir?

+0

Donc, vous voulez supprimer la limitation de pouvoir classer seulement le top 1000? – Thilo

Répondre

1

Vous pouvez envisager d'adapter quelque chose comme le projet google-appengine-ranklist à Java. Il construit un arbre de noeuds 'ranker', de sorte que l'élément nième classé peut être trouvé en O (log n), et les mises à jour sont également O (log n).

+0

+1 mais en regardant le code source, il ne sera pas si facile à comprendre/port – systempuntoout

0

Je créer une classe avec une variable statique pour contenir la valeur de comptage actuelle. Par exemple, vous pouvez créer quelque chose comme ce qui suit:

public class Counter { 
    private static int counter = -1; 

    public static synchronized int getNextValue() { 
    if (counter == -1) {     
      counter = // Insert code that retrieves the highest value from Google datastore 
    } 
    counter++; 
    return counter; 
    } 
}