2010-08-04 21 views
5

Estoy usando GAE/Java con Objectify, y estoy tratando de encontrar la forma más rápida de verificar si un objeto dado existe en el almacén de datos, dada la clave. Lo que estoy haciendo ahora es .get(key) con @Cached activado, pero de cualquier manera que todavía recupere el objeto completo, lo cual es innecesario.La forma más rápida de verificar si existe un objeto

¿Alguna idea sobre cómo hacer esto con un índice único? También estaba pensando en una consulta de solo teclas, pero estoy viendo (en el system status dashboard) que la latencia es mucho más que un get.

Respuesta

3

¿Alguna idea de cómo hacer esto con un índice de solo? También estaba pensando en una consulta de solo claves

Una consulta de solo teclas es la única forma de obtener un acierto de solo índice. Si es más rápido que un get depende del tamaño de su entidad y del tamaño de su índice. En un ejemplo trivial, estoy obteniendo alrededor de 8ms para obtener y 13ms para una consulta. Puede usar AppStats para descubrir cuál es más barato para usted con datos reales.

1

Una consulta de solo claves con un filtro en __key__ será sustancialmente más rápido que las consultas evaluadas en el panel de estado. No estoy seguro de si es más rápido o no ir a la entidad, ¡pruébalo y cuéntanos!

4

Simplemente realice un get() con la memoria caché activada. A menos que tenga mucha lógica costosa en un método @PostLoad, debería ser significativamente más económico extraer los datos de Memcache que ir hasta el almacén de datos, incluso para una consulta de solo claves. El caché es tu amigo.

Como nota al margen, esto suena como una optimización prematura. Cree su aplicación usando el código más conveniente, luego ejecute appstats y descubra dónde están los costos reales en su aplicación. Probablemente descubrirá que las piezas costosas no son lo que usted piensa.

+0

Sí, tienes razón, probablemente lo es ... todavía se siente muy mal, sin embargo. Necesito cargar un objeto completo + datos solo para ver si ese nombre (clave) ya está tomado: -/ –

1

puede probar con una única consulta de claves Objectify así:

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

Debería ser '... keys(). First(). Now()! = Null'. De lo contrario, 'LoadResult ' se compara con null, lo que da un resultado diferente ([ver API] (http://docs.objectify-appengine.googlecode.com/git/apidocs/com/googlecode/objectify/cmd/QueryExecute.html# primero())). – oliverdm

Cuestiones relacionadas