5

我有一个我想使用 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

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

顺便说一句,我已经有了字节分块逻辑,它可以切分整个字节数组并将片段放入 a ListofBlob所以这个问题与如何切分字节无关。

大多数情况下,我想知道的更多的是持久性。

4

2 回答 2

4

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

于 2012-05-21T17:50:01.900 回答
2

Rick 的答案确实是最好的 - 在 blobstore 中存储 blob,特别是如果您是 GAE 新手并且对数据存储有概念问题。

另一方面,使用拆分实体来存储 blob 有一些很好的理由,尤其是在存储接近 1M 边缘的数据时。您不希望使用 100MB 的 blob 来执行此操作,但 2MB 的 blob 是有意义的。

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

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

于 2012-05-21T19:55:16.677 回答