用Objectify Appengine存储大块

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

@Entity
public class BigBlob {

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

    ...

}

然而,“片段”是@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 中,所以这个问题不涉及如何对字节。

大多数情况下,我想知道的更多是持续的一面。

5
额外 编辑
意见: 2

2 答案

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

4
额外

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

另一方面,使用分割实体来存储Blob有一些很好的理由,特别是在存储接近1M边的数据时。你不想用100MB的blob来做到这一点,但2MB的blob可以理解。

首先,你不想序列化或嵌入。这些都是在单个实体内部构造数据的简单方法。

此外,没有魔法注释可以让您在实体之间分割斑点。你必须手工完成。您不需要实际创建“主”或根实体;只需使用由id定义的父级(但不包含实际实体)创建所有实体片段,然后使用祖先()查询来获取所有片段。

2
额外
@stickfigure你的意思是,当我编写AppengineFile时,FileService API实际上传文件?在我的情况下,我确实使用Objectify存储元数据,并使用Fileservice api使用字节进行存储
额外 作者 xybrek,
你当然可以,但blobstore相关的API是一个很难处理的工作,并且不能轻易地与其他数据存储工作进行交易。有时使用数据存储更容易,即使是多实体攻击也是如此。另一方面,blobstore存储比数据存储更便宜,所以这个选择不应该变得轻松。
额外 作者 stickfigure,
与简单的put()或获取()一个实体相比,Files API是一个怪物,使用普通的blob上传URL对程序逻辑具有高度的侵入性。关于事务 - 为什么不会你希望跨Blobstore和数据存储的事务?我经常为这个blob写一个blob和一些额外的元数据。我必须通过一些重要的环节来使操作成为事务性的。
额外 作者 stickfigure,
有了所有的文件和渠道,锁和读者和作者,Java文件API感觉过度劳累。 Python Files API似乎没有遭遇同样的问题,这不是由语言差异来解释的。尽管您仍然需要一些样板来执行多实体blob,但对于已熟悉数据存储区API的人来说,这是一个微不足道且直观的方法。但实际上,多实体blob的主要论点是能够与应用程序的事务逻辑集成。
额外 作者 stickfigure,
“另一方面,使用拆分实体来存储blob有一些很好的理由,尤其是如果你要存储的数据接近1M的边缘” - 并不是真的,没有理由不能存储小于1MB的blob blobstore也是。
额外 作者 Nick Johnson,
blobstore API怎么样很难使用?为什么你需要一个跨Blobstore和数据存储的事务?
额外 作者 Nick Johnson,
我不知道为什么它有资格作为“怪物” - 在我看来,它就像它可以实现它需要做的那样简单。而且这个比较不是单一的 - 这是为了跨越多个实体跨越blob属性而需要构建的任何基础架构!
额外 作者 Nick Johnson,
如果您有很多(百万)小块,Google存储在批量操作(例如存档)方面速度很慢。那么使用DataStore和分割大于1MB的blob可能会更好。
额外 作者 xmedeko,
每个查询仍然有10MB的限制,所以如果你分割超过10MB的文件,那么你不能通过一个查询得到它。
额外 作者 xmedeko,