2009-07-23 18 views
5

En son olarak güncellenen arketip şemasına gereksinim duyan plone arketipler (plone 2.5.X) tabanlı yüz binlerce nesnem var. Archetype şema geçiş aracı, küçük/orta sayıdaki nesneler için mükemmeldir, ancak sunucumu, hepsini taşımaya çalışan dizlerine getirerek, her zaman komut dosyasını küme haline getirdiğim noktaya getiriyor. Bir nesnenin şemasını her seferinde güncellemek istiyorum, potansiyel olarak alınan nesne gibi - bu mümkün mü? Değilse, büyük site sitelerinde arketip şemalarını güncellemeye yönelik başka yaklaşımlar var mı?Tek bir arketip nesnesinin şemasını plone'daki talep üzerine nasıl güncelleyebilirim?

Şimdiden teşekkürler!

+0

Üzgünüm, sorunuzu yanlış yazıyor, çok çabuk işaretli. archetypes.schemaextender burada size yardımcı olmaz. Cevabımı silmek için oy verdim. –

+0

Lennarts anwer hakkındaki yorumlar dikkate alındığında, bir ZEO istemcisi ekleme ve buradaki göçü yapma seçeneği var mı? Bu, sitenin kullanılabilirliğinden daha az etki yaratabilir. * Ve * aynı örnek üzerinde geçişi yapar. (Şu anda yapmakta olduğunuz varsayılmaktadır.) –

+0

evet, şu anda maalesef sadece çok fazla veri var. sadece gerçek bir istek geldiğinde, ihtiyaç duyduğu her şeyi elde etmek için uzun bir zaman alır, böylece zeo host üzerinde mega takas neden olur. Elbette onun sporadik. 2 kısa istek ve 5 süper uzun olanlar. Onun bir bummer var basit bir tembel yükseltme görünmüyor. Eğer süreç hakkında daha fazla bilgi sahibi olsaydım, bir tane yazmaktan mutlu olurdum ama biraz gizemlidir. Şaşırtıcı çünkü beklediğim tüm esnek veri şeylerine uymuyor. Teşekkürler !!! – eleddy

cevap

0

"Dizlerinin getirilmesi" nin ne anlama geldiğini açıklamıyor olsanız da, hafızanız bittiğini tahmin edeceğim. Öyleyse, büyük olasılıkla diske değişiklik yapmayan komut dosyasıyla ilgili bir soru. Döngünün içinde bir transaction.commit() eklemek (tercihen her 100 ya da 1000'inci zamanda yapmak için bir testle) bunu düzeltmelidir.

Düzenleme: Bu yüzden hatalıydım, bellek sorunu değildi. Arketipler güncelleyicinin doğru şeyi yapıyor gibi görünüyor. Bu Plone'un 2.5.3 ve ben plone ile kazma ne 3 görünüyor gelen olduğunu

if not self._isSchemaCurrent(): 
    logging.debug("updating schema for %s"%self.absolute_url()) 
     try: 
      import transaction 
      transaction.begin() 
      self._updateSchema() 
      transaction.commit() 
     except Exception, e: 
      logging.error('Error updating schema at %s: %s'%(self.absolute_url(), e)) 
      return False 
else: 
    logging.debug("schema for %s is up to date"%self.absolute_url()) 
    return True 

Not:

+0

Ne yazık ki, bu sadece bir bellek sorunu değil. Güncelleme aynı zamanda yükün (disk IO olarak) önemli ölçüde artmasına ve daha da önemlisi son kullanıcıların her zaman el ile müdahale edip öldürmesini sağlamak için güncellemenin sloganlığını da görmesine neden oluyor. Her zaman planlı bir kesinti olasılığı var ama aptal bir şema güncellemesi için bunu önlemek için çalışıyorum. Standart tek tip araç güncelleme kodunu çalıştırıyorum ve tek bir öğeyi nasıl güncelleyeceğimi göremiyorum, aksi halde döngüler ve taahhütler yazarım. Bu döngüyü nasıl yazacağınıza dair bir örnek verebilir misiniz? Teşekkürler! – eleddy

+0

Tabii ki, IO başlayacak. Diske yazılmadan veritabanının büyük bir güncellemesini yapabileceğinizi düşünüyor musunuz? Aslında gerçek bir problemin var gibi görünmüyor. Arketipler yükseltmesini çalıştırın. –

+0

elbette, müşterilerimize ödeme yaparken, saatlerce ya da tam bir kesinti için parazit tepki süresi alırken bir problemdir.Bir kerede bir öğeyi yükseltmeyi talep etmenin çok adil olduğunu düşünüyorum ve bunun küçük bir kod parçasıyla basit bir yanıt olacağını düşündüm. eğer mümkün değilse mümkün değil ve diğer seçeneklere bakmaya başlarım. Burada kod arıyorum - sorunumun ne olduğuna dair bir konuşma değil. – eleddy

5

2.5 katalog kod kazma sonra nihayet tembel şema güncellemesi cevabını buldum kısmen farklı. Ben zaten processForm'u özelleştirdiğim bazı nesneler için, formülü yeni alanı görüntüleyebilecek ve işlenecek şekilde yükseltmeyi gerçekleştiriyorum. Diğerleri için sadece at_post_edit_script kancalarında genellikle mega önemli şema yükseltmeleri yoktur. Ek olarak, form işleme, sitenin en yavaş kısmıdır, bu nedenle kullanıcı deneyimi bundan çok etkilenmez.

Onun hacky ama hiçbir I/O splurges neden olur ve nesnelerin tüm sürümleriyle çalışır. Onu alacağım!

+0

Bu kodu nasıl/nereden takıyorsunuz? – rjmunro

+0

@rjmunro Özel kod örneği var ve bunu ne kadar hızlı yükseltmeye ihtiyacım olduğuna bağlı olarak farklı yerlere koydum. Çoğu yerde onu at_post_edit kanca. Bir durumda, düzenlemeden önce yükseltmenin yapılmasını istiyorum, böylece processForm'un üzerine yazarak düzenlemeden önce yeni sürüme geçtim. Bu şekilde yeni şema içeriğini manuel olarak düzenleme formuna ekleyebilirim ve sonra almama konusunda endişelenmem gerekir. Aynı zamanda iş akışını güncellemek için de benzer bir şey yaptım, bu durumda görünüm şablonunu en üstte görüntülemeyi tetikleyen bir betiğe bir çağrı yapıyorum. Kod örneklerini istiyorsanız bana bildirin :) – eleddy

İlgili konular