2012-05-21 11 views
5

Tengo esta clase que quiero persistir utilizando Objectify, esta clase representará datos de más de 1 MB por lo que hay una lista de objetos Blob que representa un fragmento de la matriz de bytes almacenada que es menor que 1 MB de tamaño:Almacenamiento de blob grande con Objectify Appengine

@Entity 
public class BigBlob { 

    @Id 
    private Long id; 
    public static final int FRAGMENT_LIMIT = 777 * 1024; 
    @Serialized 
    private List<Blob> fragments = new ArrayList<Blob>(); 

    ... 

} 

Sin embargo, los los "fragmentos" se @Serialized, que hará que el tamaño de esta clase BigBlob/objeto más de 1 MB.

causando este error:

com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call datastore_v3.Put() was too large. 

Si uso anotación @Embedded consigo este error:

Cannot place array or collection properties inside @Embedded arrays or collections 

¿Cómo asegurarse de que los "fragmentos" se almacenan como una entidad separada?

Por cierto, ya tengo la lógica de fragmentación de bytes que corta todo el conjunto de bytes y pone los fragmentos en List de Blob, por lo que esta pregunta no se refiere a cómo cortar los bytes.

Principalmente lo que quiero saber es más del lado persistente.

Respuesta

2

La respuesta de Rick es realmente la de mejor tienda en la tienda de blobstore, especialmente si eres nuevo en GAE y tienes problemas conceptuales con el almacén de datos.

Por otro lado, hay algunas buenas razones para usar entidades divididas para almacenar blobs, especialmente si está almacenando datos que están cerca del límite de 1M. No querrá hacer esto con blobs de 100MB, pero blobs de 2MB pueden tener sentido.

En primer lugar, no desea ser serializado o incrustado. Esas son simplemente formas de estructurar datos dentro de una sola entidad.

Además, no hay una anotación mágica que le permita dividir blobs entre entidades. Tienes que hacerlo todo a mano. No es necesario crear realmente una entidad 'maestra' o raíz; simplemente cree todos los fragmentos de entidad con un elemento principal definido por un id (pero no una entidad real) y utilice una consulta ancestro() para recuperar todos los elementos.

+0

"Por otro lado, hay algunas buenas razones para usar entidades divididas para almacenar blobs, especialmente si está almacenando datos que están cerca del borde de 1M" - no realmente, no hay razón para que no pueda almacenar blobs de 1 MB en la tienda de blob, también. –

+2

Puede, sin duda, pero las API relacionadas con el almacén de blob son difíciles de manejar y no se pueden hacer fácilmente transaccionales con otras tareas del almacén de datos. A veces es mucho más fácil usar el almacén de datos, incluso con el hack de múltiples entidades. Por otro lado, el almacenamiento en blobstore es más barato que el almacenamiento en el almacén de datos, por lo que esta opción no debe hacerse de manera frívola. – stickfigure

+0

¿Qué pasa con las API de blobstore es difícil trabajar con ellas? ¿Y por qué necesita una transacción que abarque blobstore y el almacén de datos? –

4

Debe almacenarlo en el Almacén de blob y simplemente guardar el Blobkey en Objectify. Objectify funciona en la parte superior del almacén de datos, no en la librería de blobs.

Cuestiones relacionadas