2012-05-21 20 views
5

Objectify kullanılarak devam etmek istediğim bu sınıfa sahip olduğum için, bu sınıf 1MB'den büyük bir veriyi temsil edecek, böylece depolanan bayt dizisinin bir parçasını temsil eden Blob nesneleri listesi var. büyüklüğü 1 MB:Büyük bloğu Objectify Appengine ile depolama

@Entity 
public class BigBlob { 

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

    ... 

} 

Yine, "fragmanları" @Serialized olup, bu BigBlob sınıfının/boyutunu verecek 1 MB daha büyük nesne.

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

nasıl "fragmanları" ayrı bir varlık olarak depolanır emin olun: Ben bu hatayı alıyorum @Embedded ek açıklama kullanırsanız

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

:

bu hatayı mu çıkartıyor?

BTW, bayt dizisi mantığına sahiptüm ve bu bayt dizisini ListBlob içine koyun, bu nedenle bu soru baytların nasıl kesileceğiyle ilgili değildir.

Çoğunlukla bilmek istediğim şey daha çok ısrarcı tarafta.

cevap

2

Rick'in yanıtı, özellikle GAE'ye yeni iseniz ve veri deposuyla ilgili kavramsal sorunlarınız varsa, mağazadaki en iyi mağaza lekeleridir. Diğer yandan, özellikle 1M kenarına yakın verileri depolarsanız, blobları depolamak için bölünmüş öğeleri kullanmanın bazı iyi nedenleri vardır. Bunu 100MB blob ile yapmak istemezsiniz, ancak 2MB lekeler anlamlı olabilir.

Her şeyden önce, serileştirilmiş veya gömülü istemezsiniz. Bunlar, verileri tek bir varlık içinde yapılandırmanın basit yollarıdır.

Ayrıca, blobları varlıklar arasında bölmenizi sağlayan sihirli bir açıklama yoktur. Her şeyi el ile yapmalısın. Aslında bir 'ana' veya kök varlık oluşturmanız gerekmez; Tüm varlık parçalarını bir kimlikle tanımlanmış bir üst öğe ile (yalnızca gerçek bir varlık) oluşturun ve tüm parçaları getirmek için bir ataş() sorgusu kullanın.

+0

"Öte yandan, özellikle 1M kenarına yakın verileri depolıyorsanız, blobları depolamak için bölünmüş öğeleri kullanma konusunda bazı iyi nedenler var" - aslında, küçük harfleri depolayabileceğiniz için hiçbir neden yok Blob mağazasında da 1MB'den daha fazla. –

+2

Kesinlikle yapabilirsiniz, ancak blobstore ile ilgili API'lar çalışmak için bir acıdır ve diğer veri deposu çalışmaları ile kolayca işlem yapamazlar. Bazen, çok varlıklı hack ile bile veri deposunu kullanmak çok daha kolay. Diğer taraftan, blobstore depolama alanı veri deposu depolamasından daha ucuzdur, bu nedenle bu seçenek anlamsız bir şekilde yapılmamalıdır. – stickfigure

+0

Blobstore API'ları hakkında çalışmak zor mu? Ve neden Blobstore'u ve veri mağazasını kapsayan bir işleme ihtiyacın var? –

4

Blobstore'da saklayın ve Blobkey'i Objectify'a kaydetmeniz yeterlidir. Obje deposunda değil, veri deposunun üstünde çalışır.