google-app-engine - móviles - manual de programacion android pdf
¿Buenos ejemplos de código abierto del uso de grupos de entidades en App Engine? (3)
Conozco todos los detalles sobre cómo funcionan los grupos de entidades en el almacenamiento de GAE, pero ayer (en la reunión de App Engine en Palo Alto), como presentador estaba explicando su uso de grupos de entidades, me sorprendió que nunca los haya utilizado realmente. en mis propias aplicaciones GAE, y no recuerdo haberlas visto en aplicaciones GAE de código abierto que he usado.
Entonces, sospecho que acabo de pasar por alto (sin notar ni recordar) esos ejemplos porque simplemente no estoy acostumbrado a ellos lo suficiente como para conectar de inmediato el "uso del grupo de entidades" al "tipo de problemas de aplicación que se resuelven", y Creo que debería remediarlo estudiando tales fuentes con este objetivo en mente, centrándome en qué problema está resolviendo el uso de EG (es decir, por qué la aplicación funciona con él, pero no funcionaría o no funcionaría bien sin él).
¿Alguien puede sugerir buenas URL para dicho código? (Los ensayos también serían bienvenidos, si se enfocan en la resolución de problemas a nivel de aplicación, pero no si, como la mayoría de los que he visto, ¡solo se enfocan en los detalles de cómo funcionan los EG!).
El principal uso de los grupos de entidades es proporcionar los medios para actualizar más de una entidad en una transacción.
Si no has tenido que usarlos, cuenta tus bendiciones. O ha estado diseñando sus modelos de datos de modo que no es necesario actualizar dos entidades al mismo tiempo para mantener la coherencia, o si no las necesita, pero ha tenido suerte :)
Imagine que tengo un tipo de entidad Factura y un tipo de entidad LineItem. Una factura puede tener múltiples LineItems asociados a ella. La entidad My Factura tiene un campo llamado LastUpdated. Cada vez que se agrega un LineItem a mi factura, quiero almacenar la fecha actual en el campo LastUpdated.
Mi función de actualización podría verse así (pseudocódigo)
invoice.lastUpdated = now()
lineitem = new lineitem()
invoice.put()
lineitem.put()
¿Qué sucede si la factura put () tiene éxito y el elemento de línea put () falla? La fecha de mi factura mostrará que algo se actualizó, pero la actualización real (el nuevo LineItem) no estaría allí. La solución es poner ambas puts () dentro de una transacción.
Una solución alternativa sería utilizar una consulta para encontrar la fecha del último LineItem insertado, en lugar de almacenar esta información en el campo lastUpdated. Pero eso implicaría obtener tanto la factura como todos los elementos de línea cada vez que quisiera saber la última vez que se agregó un elemento de línea, lo que le costará una cuota de almacenamiento de datos valiosa.
EDITAR PARA RESPONDER A LOS COMENTARIOS DEL CARTEL
Ah. Creo que entiendo tu confusión. Los párrafos anteriores establecen por qué las transacciones son importantes. Pero dices que todavía no te importan los grupos de Entidades, porque no ves cómo se relacionan con las transacciones. Pero si usa db.run-in-transaction, entonces está usando grupos de entidades, ¡quizás sin darse cuenta! Cada transacción involucra a un solo grupo de entidades, y cualquier transacción determinada solo puede afectar a las entidades que pertenecen al mismo grupo. ver here
"Todas las operaciones del almacén de datos en una transacción deben operar en entidades en el mismo grupo de entidades".
¿Qué tipo de cosas estás haciendo en tus transacciones? Hay muchas buenas razones para usar transacciones con una sola Entidad, que por defecto está en su propio Grupo de Entidades. Pero a veces necesitas mantener sincronizadas 2 o más entidades, como en mi ejemplo anterior. Si la factura y las entidades de LineItem no están en el mismo grupo de entidades, entonces no podría envolver las modificaciones en una llamada db.run-in-transaction. Por lo tanto, cada vez que desee operar transaccionalmente en 2 o más entidades, primero debe asegurarse de que estén en el mismo grupo. Espero que sea más claro por qué son útiles.
Los he usado here en este sencillo sistema wiki. La última versión de una página es siempre una entidad raíz y las versiones anteriores tienen la última versión como antecesor. La operación de copia se realiza en una transacción para mantener la consistencia de la versión y evitar perder una versión en caso de concurrencia.
Los he usado here . Estoy configurando el objeto de mi cliente como el padre de los marcadores del mapa. Esto crea un grupo de entidades para cada cliente y me da dos ventajas:
Obtener los marcadores de un cliente es mucho más rápido, porque están almacenados físicamente con el objeto del cliente (en el mismo servidor, probablemente en el mismo disco)
Puedo cambiar los marcadores para un cliente en una transacción. Sospecho que el motivo por el cual las transacciones requieren que todos los objetos en los que operan estén en el mismo grupo es porque están almacenados en la misma ubicación física, lo que hace que sea más fácil implementar un bloqueo en los datos.