2012-04-16 17 views
24

¿Cuál es la mejor/más rápida manera de verificar si una entidad existe en un datastore de motor de la aplicación google? Por ahora estoy tratando de obtener la entidad por clave y verificar si el get() devuelve un error.Comprobando si la entidad existe en el almacén de datos del motor de la aplicación google.

No conozco el proceso para obtener una entidad en el almacén de datos. ¿Hay una forma más rápida de hacer solo este control?

+0

obtener una entidad por clave nunca devolverá un error, devuelve Ninguno. – aschmid00

+5

En java 'get' arroja una excepción cuando no se encuentra la entidad: https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService#get(com.google .appengine.api.datastore.Key) –

+0

ok no sabía eso. – aschmid00

Respuesta

4

com.google.appengine.api ha quedado obsoleto a favor del cliente de App Engine GCS.

¿Ha considerado utilizar una consulta? Adivinar y verificar no es una forma escalable de encontrar una entidad en un almacén de datos. Una consulta puede ser creado para recuperar entidades del almacén de datos que cumplen con un conjunto específico de condiciones:

https://developers.google.com/appengine/docs/java/datastore/queries

EDIT:

¿Qué pasa con la tecla de sólo consulta? Las consultas de solo clave se ejecutan más rápido que las consultas que devuelven entidades completas. Para devolver solo las claves, use el método Query.setKeysOnly().

new Query("Kind").addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, key).setKeysOnly(); 

Fuente: [1]: http://groups.google.com/group/google-appengine-java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli=1

+1

¿La respuesta de tiempo para hacer una consulta es mejor para obtener una entidad? – Victor

+13

No, la consulta siempre llevará más tiempo y costará más, así que no creo que esta sea la respuesta correcta. –

+1

El costo de una consulta con el filtro .setKeysOnly() tiene el mismo costo que una sola operación de obtención (tanto en términos de contabilidad como de tiempo de ejecución efectivo, ya que esto está determinado principalmente por el tiempo de ida y vuelta de la red). También tenga en cuenta que la consulta para KEY_RESERVED_PROPERTY se trata de una manera especial, ya que no utiliza un índice coherente eventual como lo haría una consulta para cualquier otro atributo, pero es muy consistente en su lugar. Esto hace que esta respuesta sea perfectamente válida, aunque los ahorros al obtener las claves solo no están especificados para este tipo de consulta. – Ext3h

3

Usted se pudo obtener utilizando un List<Key> que contiene solamente un Key, that method devuelve un Map<Key, Entity> que se puede comprobar si contiene un valor real o null, por ejemplo:

Entity e = datastoreService.get(Arrays.asList(key)).get(key); 

en general, sin embargo creo que sería más fácil para envolver el get() en un try/catch que devuelve null si se captura el EntityNotFoundException.

+0

¿Por qué esto es mejor solo usando get (Key)? – Victor

+0

Me parece más "correcto" si solo va a buscar una clave, pero es una preferencia totalmente personal y depende de usted. –

+0

Pregunto mejor basado en el tiempo de respuesta – Victor

6

Lo que usted propuso sería, de hecho, la forma más rápida de saber si su entidad existe. Lo único que te hace más lento es el tiempo que lleva buscar y deserializar tu entidad. Si tu entidad es grande, esto puede ralentizarte.

Si esta acción (verificar la existencia) es un importante cuello de botella para usted y tiene entidades grandes, puede rodar su propio sistema de control utilizando dos entidades: primero, tendría su entidad existente con datos, y una segunda entidad que almacena la referencia a la entidad real, o tal vez una entidad vacía donde la clave es solo una variación de la clave de entidad original que puede calcular. Puede verificar la existencia rápidamente usando la segunda entidad, y luego buscar la primera entidad solo si los datos son necesarios.

La mejor forma en que pienso sería simplemente diseñar sus llaves de modo que usted sepa que no habría duplicados, o que sus operaciones son idempotentes, de modo que incluso si se sobreescribiera una entidad anterior, no importaría.

+0

No creo que haya una manera de evitar esta comprobación cuando varios procesos se ejecutan en paralelo. La única manera de garantizar que no haya duplicados es usar una transacción: verifique si una entidad ya existe, si no, cree una nueva entidad. –

+0

Probablemente no entendiste mi respuesta. Dije más o menos lo mismo. Y luego, agregué una optimización en el caso donde tienes entidades grandes y no quieres deserializar la entidad grande. Podría tener una segunda entidad pequeña para verificar la existencia, de modo que regrese mucho más rápido que recuperar la entidad grande. Pero estás escribiendo, tendrías que escribir esas dos entidades en una transacción. – dragonx

Cuestiones relacionadas