Хранение большого блога с Objectify Appengine
У меня есть этот класс, который я хочу сохранить с помощью Objectify, этот класс будет представлять данные размером более 1 МБ, поэтому существует список объектов Blob, который представляет сохраненный фрагмент байтового массива размером менее 1 МБ:
@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 больше 1 МБ.
Вызывает эту ошибку:
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
Как мне убедиться, что "фрагменты" хранятся как отдельный объект?
Кстати, у меня уже есть логика разбивки байтов, которая разбивает весь массив байтов и помещает фрагменты в List
из Blob
так что этот вопрос не касается того, как разрезать байты.
Главным образом то, что я хочу знать, это больше на сохраняющейся стороне.
2 ответа
Ответ Рика действительно лучший - хранить капли в буфере, особенно если вы новичок в GAE и у вас есть концептуальные проблемы с хранилищем данных.
С другой стороны, есть несколько веских причин использовать разделенные объекты для хранения больших двоичных объектов, особенно если вы храните данные, которые находятся близко к границе 1М. Вы не хотели бы делать это с каплями размером 100 МБ, но с каплями размером 2 МБ может иметь смысл.
Прежде всего, вы не хотите сериализовать или встраивать. Это просто способы структурировать данные внутри единого объекта.
Кроме того, нет волшебной аннотации, которая позволяла бы разбивать капли между сущностями. Вы должны сделать все это вручную. Вам не нужно создавать "мастер" или корневую сущность; просто создайте все фрагменты сущности с родителем, определенным идентификатором (но без фактической сущности), и используйте запрос ancestor() для извлечения всех кусочков.
Вы должны сохранить его в Blobstore и просто сохранить Blobkey в Objectify. Objectify работает поверх хранилища данных, а не из блоба.