【问题标题】:Storing large blob with Objectify Appengine使用 Objectify Appengine 存储大型 blob
【发布时间】:2012-05-28 05:35:42
【问题描述】:

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

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

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

我想知道的更多是持久性方面。

【问题讨论】:

    标签: google-app-engine objectify


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • “另一方面,使用拆分实体来存储 blob 有一些很好的理由,尤其是在存储接近 1M 边缘的数据时” - 不是真的,没有理由可以也不要在 blobstore 中存储小于 1MB 的 blob。
      • 当然可以,但是与 blobstore 相关的 API 使用起来很麻烦,并且不能轻易地与其他数据存储工作进行事务处理。有时,即使使用多实体 hack,使用数据存储也容易得多。另一方面,blobstore 存储比数据存储存储便宜,因此不应轻率地做出此选择。
      • blobstore API 难以使用怎么办?为什么需要跨越 blobstore 和数据存储的事务?
      • 与 put()ing 或 get()ing 实体的简单性相比,Files API 是一个怪物,并且使用正常的 blob 上传 URL 对程序逻辑具有高度侵入性。关于事务 - 为什么您想要跨越 blobstore 和数据存储的事务?我经常为该 blob 编写一个 blob 和一些额外的元数据。我必须经历一些重要的环节才能使操作应该是事务性的。
      • 拥有所有文件、通道、锁以及读取器和写入器,Java 文件 API 感觉设计过度。 Python 文件 API 似乎没有遇到同样的问题,这不是由语言差异来解释的。虽然您仍然需要一些样板来执行多实体 Blob,但对于已经熟悉数据存储 API 的人来说,这是一个微不足道且直观的操作。但实际上,多实体 Blob 的主要论点是能够与应用程序的事务逻辑集成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2012-11-22
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      相关资源
      最近更新 更多