2010-08-04 25 views
5

GAE/Java Objectify ile kullanıyorum ve verili bir nesne veri tabanında veri olup olmadığını kontrol etmenin en hızlı yolunu bulmaya çalışıyorum. Şu anda yaptığım şey, @Cached numaralı .get(key)'dur, ancak her ne kadar gereksiz olan tüm nesneyi hala alır.Nesnenin var olup olmadığını kontrol etmenin en hızlı yolu

Bunu bir endeksle nasıl yapacağınıza dair herhangi bir fikir sadece vuruldu mu? Ben de sadece bir anahtar sorgusu düşünüyordum, ama (system status dashboard üzerinde) gecikmenin get'dan daha fazla olduğunu görüyorum.

cevap

3

dizini ile bununla ilgili herhangi bir fikir yalnızca vuruldu mu? Ben de

A tuşlarına okunur sorgu yalnızca sorgu bir tuşların düşünüyordum bir almak için tek yoldur endeksi salt çarptı. Edinme işleminden daha hızlı olsun, varlığınızın boyutuna ve dizininizin boyutuna bağlıdır. Önemsiz bir örnekte, bir sorgu için 8ms ve bir sorgu için 13ms alıyorum. Gerçek verilerle sizin için hangisinin daha ucuz olduğunu öğrenmek için AppStats'ı kullanabilirsiniz.

1

Yalnızca bir anahtarın yalnızca __key__ numaralı bir filtreyle sorgulaması, durum kontrol panelinde karşılaştırılan sorgulardan önemli ölçüde daha hızlı olacaktır. Varlığı almaktan daha hızlı olsun ya da olmasın, emin değilim - bunu deneyin ve bize bildirin!

4

Sadece önbellek açıkken bir get() yapın. Bir @PostLoad yönteminde çok pahalı bir mantığınız olmadığı sürece, memcache'den verileri almak için, yalnızca bir anahtar sorgu için bile veri deposuna gitmekten çok daha ucuz olmalıdır. Önbellek senin arkadaşın.

Bir yan not olarak, bu erken bir optimizasyon gibi geliyor. En uygun kodu kullanarak uygulamanızı oluşturun, ardından appstat'ları çalıştırın ve gerçek maliyetlerin uygulamanızda nerede olduğunu öğrenin. Muhtemelen pahalı parçaların sizin düşündüğünüz gibi olmadığını göreceksiniz.

+0

Evet, muhtemelen haklı ki ... Yine de çok yanlış geliyor. Bu adın (anahtarın) önceden alınmış olup olmadığını görmek için bir nesnenin tamamını + vermem gerekiyor: -/ –

1

Böyle bir anahtarları somutlaştırabilir sadece sorguyu deneyebilirsiniz:

public static boolean objectExists(String id, Class<?> objectClass) { 
    return OfyService.ofy().load().filterKey(Key.create(objectClass, id)).keys().first() != null; 
} 
+0

"... keys(). First(). Now()! = Null". Aksi takdirde, 'LoadResult 'farklı bir sonuç veren null ile karşılaştırılır (API'ya bakın) (http://docs.objectify-appengine.googlecode.com/git/apidocs/com/googlecode/objectify/cmd/QueryExecute.html# ilk())). – oliverdm

İlgili konular