2010-08-04 31 views
5

Sto utilizzando GAE/Java con Objectify e sto cercando di trovare il modo più veloce per verificare se esiste un determinato oggetto nel datastore, data la chiave. Quello che sto facendo adesso è .get(key) con @Cached su, ma in entrambi i casi recupera ancora l'intero oggetto, che non è necessario.Il modo più veloce per verificare se esiste un oggetto

Qualche idea su come fare questo con un indice ha colpito solo? Stavo anche pensando a una query su solo chiavi, ma sto vedendo (sullo system status dashboard) che la latenza è molto più di una get.

risposta

3

Qualche idea su come fare questo con un indice ha colpito solo? Stavo anche pensando a una chiave solo query

Una query solo-chiave è l'unico modo per ottenere un hit solo indice. Se è più veloce di un guadagno dipende dalle dimensioni della tua entità e dalla dimensione dell'indice. In un banale esempio, mi trovo a circa 8ms per ottenere e 13ms per una query. Puoi utilizzare AppStats per capire quale è più economico per te con dati reali.

1

Una query di chiavi con un filtro su __key__ sarà notevolmente più veloce rispetto alle query di riferimento nel dashboard di stato. Indipendentemente dal fatto che sia più veloce del semplice recupero dell'entità non ne sono sicuro - prova e facci sapere!

4

Basta eseguire un get() con la cache attivata. A meno che tu non abbia molta logica costosa in un metodo @PostLoad, dovrebbe essere molto più economico recuperare i dati da memcache piuttosto che andare fino all'archivio dati anche per una query solo su chiavi. Il cache è tuo amico.

Come nota a margine, sembra un'ottimizzazione prematura. Crea la tua app utilizzando il codice più conveniente, quindi esegui appstats e scopri dove sono i costi effettivi nella tua applicazione. Probabilmente scoprirai che le parti costose non sono ciò che pensi.

+0

Sì, hai ragione, probabilmente è ... si sente ancora molto male, però. Ho bisogno di caricare un intero oggetto + dati solo per vedere se quel nome (chiave) è già stato preso: -/ –

1

si può provare un solo chiavi query da oggettivare come questo:

public static boolean objectExists(String id, Class<?> objectClass) { 
    return OfyService.ofy().load().filterKey(Key.create(objectClass, id)).keys().first() != null; 
} 
+0

Dovrebbe essere '... keys(). First(). Now()! = Null'. Altrimenti 'LoadResult ' viene confrontato con null che fornisce un risultato diverso ([vedi API] (http://docs.objectify-appengine.googlecode.com/git/apidocs/com/googlecode/objectify/cmd/QueryExecute.html# primo())). – oliverdm

Problemi correlati