使用Objectify Appengine存储大blob

时间:2012-05-21 17:43:12

标签: google-app-engine objectify

我有这个类我想用Objectify持久化,这个类将代表一个大于1MB的数据,所以有一个Blob对象列表,表示存储的字节数组的片段,其大小小于1MB:

@Entity
public class BigBlob {

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

    ...

}

然而,“片段”是@Serialized,它将使这个BigBlob类/对象的大小大于1MB。

导致此错误:

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

如果我使用@Embedded注释,我会收到此错误:

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

如何确保“片段”作为单独的实体存储?

BTW,我已经有了字节分块逻辑,它会切断整个字节数组并将片段放入List Blob中,所以这个问题与如何切换字节无关。

大多数我想知道的更多是坚持不懈的一面。

2 个答案:

答案 0 :(得分:4)

您应该将它存储在Blobstore中,并将Blobkey保存在Objectify中。 Objectify在数据存储区之上工作,而不是blobstore。

答案 1 :(得分:2)

Rick的答案实际上是blobstore中最好的商店blob,特别是如果你是GAE的新手并且对数据存储有概念性问题。

另一方面,使用拆分实体存储blob有一些很好的理由,特别是如果要存储接近1M边缘的数据。您不希望使用100MB blob执行此操作,但2MB blob可能有意义。

首先,您不希望序列化或嵌入。这些只是在单个实体内构建数据的简单方法。

此外,没有神奇的注释可以让你跨实体分割blob。你必须手工完成所有这些。您不需要实际创建“主”或根实体;只需使用由id(但没有实际实体)定义的父项创建所有实体片段,并使用ancestor()查询来获取所有片段。