2010-05-03 18 views
8

AppEngine veritabanı (Java için) hakkında okudum daha yaygın şikayetlerden biri, "soğuk başlangıç ​​zamanı" geldiğinde çok yavaş olmasıdır. Ne anlama geliyor? Endişelenmem gereken bir şey mi?AppEngine veritabanı "soğuk başlangıç ​​zamanı" nedir?

+1

endişelenmelisiniz. Uygulama motoru ekibi, canlı bir JVM'yi ayırmanın bir yolu üzerinde çalışıyor. Böylece, neredeyse hiç yükleme isteğiniz olmayacak. –

+0

Bunun neden endişelenmeniz gerektiğinden emin değilsiniz, ama bu harika bir haber. Şu anda çok az trafiği olan uygulamaların JVM eğrileri açısından gerçekten acı çektiği anlar. – Finbarr

cevap

10

Endişelenmeniz gereken bir şey.

Google App Engine, uygulamanızın belirli bir süre boyunca herhangi bir isteği olmadığında hizmet isteklerine yeni bir JVM atar. Veri deposunda "soğuk" dan - yani ilk kez bir JVM'de - bir kolun tutulması 5+ saniye kadar önemli bir zaman alabilir.

Veri deposunda bir tanıtıcınız olduğunda (normalde bir PersistenceManager örneği), her şey iyi (JVM'nin ömrü için!).

DÜZENLEME: GAE'nin-Java taze JVM kadar Spinning

da yavaştır. http://code.google.com/appengine/docs/java/datastore/overview.html'u okuyun ve bir "kullanılabilirliği için bir Singleton sınıfı kullandıklarını göreceksiniz, çünkü bunlar" pahalı "olarak bir örnekleme işlemini açıklıyor.

Bunu kendiniz için test edebilirsiniz. Sadece "Merhaba Dünya!" Ifadesini döndüren GAE-Java'da yepyeni bir uygulama oluşturun. ve uygulamanın ilk isteğinin birkaç saniye sürdüğünü göreceksiniz.

PersistenceManagerFactory için bir istek ekleyin ve ilk isteğin birkaç saniye sürdüğünü göreceksiniz.

DÜZENLEME DÜZENLEME:

http://stackoverflowanswers.appspot.com/helloworld

Ya anında göreceksiniz "Merhaba, Dünya 0" veya "Merhaba, Dünya xxxx": Şimdi izleme keyfi için bu testi yarattık

xxxx, MS'de, veri deposunda bir tanıtıcı elde etmek için ne kadar sürdüğü bir sayıdır. Veri mağazasındaki karmaşıklığın ve dizinlerin sayısının, diğer uygulamalardan bazılarına göre bu uygulamada daha hızlı olduğu için veri deposunda bir işlem yapmanın ne kadar sürdüğünü etkileyebileceğini düşünüyorum.

PMF, uygulama motoru belgelerinde sağlananın tam bir kopyasıdır.

javax.jdo:

@SuppressWarnings("serial") 
public class HelloWorldServlet extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 
     long a = System.currentTimeMillis(); 
     PersistenceManager p = PMF.get().getPersistenceManager(); 
     long b = System.currentTimeMillis() - a; 
     resp.setContentType("text/plain"); 
     resp.getWriter().println("Hello, world "+b); 
    } 
} 

DÜZENLEME DÜZENLEME DÜZENLEME: her isteğiyle bir PersistenceManagerFactory başlatır ve şimdi 500 sunucu hataları atar ve günlüklerde böylece

kodumu değiştirdi .JDOFatalUserException: Uygulama kodu, işlemleri isteğe bağlı bir PersistenceManagerFactory oluşturmayı denedi, ancak ile bu ad zaten var! PersistenceManagerFactory öğesinin örnekleri oluşturmak için oldukça yavaştır ve genellikle bir defadan fazla bir tane olmak üzere oluşturmak için gerekli değildir. Bunun yerine, bir tek kişilik oluşturun ve kodunuz boyunca 'u paylaşın. gerçekten PersistenceManagerFactory ( için en uygun olmayan bir paket için) oluşturmaya ihtiyaç duyarsanız, appengine.orm.disable.duplicate.pmf değerini ayarlayın.Bu hatayı önlemek için istisna sistem özelliği.

Uygulama motorundaki veri deposunda tanıtıcıdan yararlanmanın SLOW olduğu konusunda daha fazla kanıt sunmam gerektiğini sanmıyorum. Uygulamanızı hemen dağıtmayı planlıyorsanız

+2

Bunun, veri deposuyla ilgisi olmadığını unutmayın - App Engine bir platformdur. –

+0

Eh, iki el ele gider gibi görünüyor. App Engine'in JDO veya JPA kullanarak Bigtable veri mağazasının kendi uygulaması vardır. Veri deposu platformun bir parçasıdır. – Finbarr

+1

finbarr, soğuk başlangıçların büyük gecikmesinin veri deposuyla bağlantı kurduğunu gösteren ölçümleriniz var mı? Gecikmenin bir JVM başlatması olduğunu sanmıştım. Onlar python çalışma zamanı da veri deposuna bir tanıtıcı almak gerekiyor ve aynı soğuk başlangıç ​​sorunları yok. Bu bana veri tabanının yavaş, ama java veya java kütüphaneleri olmadığını düşünmemi sağlıyor. Örneğin, düşük düzeyli API'yi JDO'yu kullanarak kullanırsanız ne olur? –

İlgili konular