Hazırda Bekletme modunda tembel yükleme nedir?


178

Java'da tembel yükleme nedir? Süreci anlamıyorum. Birisi tembel yükleme sürecini anlamama yardımcı olabilir mi?

Yanıtlar:


268

Diyelim ki bir ebeveyniniz var ve ebeveynin bir çocuk koleksiyonu var. Hazırda bekletme modu artık çocukları "tembel olarak yükleyebilir", bu da ebeveyni yüklerken tüm çocukları yüklemediği anlamına gelir. Bunun yerine, istendiğinde bunları yükler. Bunu açıkça isteyebilirsiniz veya bu çok daha yaygındır, hazırda bekletme modu, bir çocuğa erişmeye çalıştığınızda otomatik olarak yükler.

Tembel yükleme, genellikle çocuklara ihtiyaç duymayacağınız ve böylece yüklenmeyecekleri için performansı önemli ölçüde artırabilir.

Ayrıca n + 1 sorununa da dikkat edin. Koleksiyona eriştiğinizde Hazırda Bekletme aslında tüm çocukları yüklemez. Bunun yerine, her çocuğu ayrı ayrı yükleyecektir. Koleksiyon üzerinde yineleme yaparken, bu her çocuk için bir sorguya neden olur. Bundan kaçınmak için, hazırda bekletme modunu tüm çocukları aynı anda yüklemeye kandırabilirsiniz, örn. Parent.getChildren (). Size ().


5
Alternatif olarak Hibernate.initialize (parent.getChildren ()) kullanılmalıdır
HAKUNAMATATA

18
"Koleksiyona eriştiğinizde ... her çocuğu ayrı ayrı yükleyecek" ifadesi aslında tamamen yanlıştır. Aslında tam tersi. Parent.getChildren () yönteminin herhangi bir başvurusu, Hazırda Beklet öğesinin koleksiyondaki tüm alt öğeleri tek bir db sorgusuna yüklemesine neden olur. Çok özel "ekstra tembel" tembel yükleme ipucu kullanmadığınız sürece. Veya koleksiyonu ikinci düzey önbellekte önbelleğe almazsanız ve ilişkili çocuklar da önbelleğe alınmaz.
Steve Ebersole

Ah, Yığın Taşması - sayfanın altında bulunan en iyi cevap ;-)
Piotrek Hryciuk

76

Bir varlık yüklenmiş olacağını "Geç yükleme" anlamına gelir sadece ne zaman aslında için varlık erişen ilk defa.

Desen şu şekildedir:

public Entity getEntity() {
    if (entity == null) {
        entity = loadEntity();
    }
    return entity;
}

Bu / ön yükleme Önceden dolduruluyor maliyetini kaydeder tüm hepsi aslında gerekmez sonra size süre önceden büyük bir veri kümesi varlıkları tüm bunlardan.

Hazırda Bekletme modunda, bir alt öğe koleksiyonunu tembel olarak yükleyecek şekilde yapılandırabilirsiniz. Gerçek geç yükleme sonra yöntemlerine içine yapılır PersistentSet"davlumbaz altında" hangi hazırda kullanımlar olarak varlıkların koleksiyonunu atamak Set.

Örneğin

public class Parent {
    private Set<Child> children;

    public Set<Child> getChildren() {
        return children;
    }
}

.

public void doSomething() {
    Set<Child> children = parent.getChildren(); // Still contains nothing.

    // Whenever you call one of the following (indirectly), 
    // Hibernate will start to actually load and fill the set.
    children.size();
    children.iterator();
}

25

Martin Fowler, Kurumsal Uygulama Mimarisinin Kalıplarındaki Tembel Yük modelini şu şekilde tanımlar :

İhtiyacınız olan tüm verileri içermeyen, ancak nasıl elde edileceğini bilen bir nesne.

Bu nedenle, belirli bir nesneyi yüklerken fikir, ilgili performans maliyetini kaydetmek için hemen kullanamayacağınız ilgili nesne (ler) i yüklemek istemez. Bunun yerine, ilgili nesneler yalnızca kullanıldığında yüklenecektir.

Bu, veri erişimi ve Hazırda Bekletme'ye özgü bir model değildir, ancak bu tür alanlarda özellikle kullanışlıdır ve Hazırda Beklet, bire çok ilişkilendirmelerin ve tek nokta ilişkilendirmelerinin (bire bir ve çoktan bire) tembel yüklemesini destekler belirli şartlar altında. Tembel etkileşim, Hibernate 3.0 Başvuru Belgeleri Bölüm 19'da daha ayrıntılı olarak ele alınmaktadır .


15

Tembel yükleme tembel yükleme doğrudur.Lazy yükleme, seçme sorgusu yürütüldüğünde veritabanına vurmayacağı anlamına gelir. Getter işlevini bekleyecek, yani gerektiğinde datbase'den getirilecek. örneğin: Çok oyuncaklı bir çocuğu olan bir ebeveynsiniz. Ama şu anki sorun, onu her aradığınızda (bir oğlunuz olduğunu varsayalım), o da size tüm oyuncakları ile geliyor. Şimdi bu bir konudur, çünkü onun oyuncaklarını her zaman taşımasını istemezsiniz. Dolayısıyla, mantıksal ebeveyn olarak, hemen ileri gidersiniz ve çocuğun oyuncaklarını LAZY olarak tanımlarsınız. Şimdi onu her aradığınızda, oyuncakları olmadan size geliyor.


11

Tembel getirme, Üst Nesne yüklenirken alt nesnelerin yüklenip yüklenmeyeceğine karar verir. Bu ayarı üst sınıfın ilgili hazırda bekleme eşleme dosyasını yapmanız gerekir. Lazy = true(alt öğeyi yüklememek anlamına gelir) Varsayılan olarak alt nesnelerin tembel yüklemesi doğrudur.

Bu, üst nesnelerde getChild()yöntemi çağırarak uygulamada açıkça çağrılmadığı sürece alt nesnelerin yüklenmediğinden emin olun.Bu durumda hazırda bekletme getChild(), ana nesnede etkin olarak çağrıldığında alt öğeyi yüklemek için yeni bir veritabanı çağrısı gönderir .

Ancak bazı durumlarda üst öğe yüklendiğinde alt nesneleri yüklemeniz gerekir. Sadece lazy = false yapın ve hazırda bekletme, üst öğe veritabanından yüklendiğinde alt öğeyi yükler.

Örnek: Bir TABLANIZ varsa? EMPLOYEE, Çalışan nesnesiyle eşleştirilir ve Adres nesneleri kümesi içerir. Üst Sınıf: Çalışan sınıfı, Çocuk sınıfı: Adres Sınıfı

public class Employee { 
private Set address = new HashSet(); // contains set of child Address objects 
public Set getAddress () { 
return address; 
} 
public void setAddresss(Set address) { 
this. address = address; 
} 
} 

Employee.hbm.xml dosyasında

<set name="address" inverse="true" cascade="delete" lazy="false"> 
<key column="a_id" /> 
<one-to-many class="beans Address"/> 
</set> 

Yukarıdaki yapılandırmada. Eğer lazy="false": - Çalışan nesnesini yüklediğinizde o zaman alt nesne Adresi de yüklenir ve setAddresss () yöntemine ayarlanır. Worker.getAdress () öğesini çağırırsanız yüklenen veriler geri döner. Yeni veritabanı çağrısı yok.

Eğer lazy="true": - Bu varsayılan yapılandırmadır. Eğer bahsetmiyorsanız o zaman hazırda bekletme tembel = doğru düşünün. Çalışan nesnesini yüklediğinizde alt nesne Adress yüklenmez. Adres nesnelerini almak için veri tabanına ekstra çağrı yapmanız gerekir. Aradığınızda employee.getAdress()o zaman veritabanı sorgusu patlar ve sonuçları döndürür. Yeni veritabanı çağrısı.


Bu senaryoda, Çalışan ve Adresin Ebeveyn-Çocuk ilişkisi yoktur. Öyle 'has-a' ilişki !
Ram

Bu birleşme miras değil.
Rishi

11

Layman'ın dilinde, bir kek yapıyormuşsunuz gibi ve buzdolabından 5-10 malzemeye ihtiyacınız olacak. İki seçeneğiniz var, tüm malzemeleri buzdolabından alın ve mutfak platformunuza koyun veya istediğiniz öğeyi istediğiniz zaman getirin.

Benzer şekilde, istekli yüklemede, fasulye ve onun ilgili sınıfları (çocuk ya da bir ilişki değil), ancak bir ilişkisi vardır, yani kek un, süt var, krem ​​vb.) Ve tembel yükleme durumunda ilk olarak tüm bilgileri alırsınız. sadece aynı tablodan gelen tanımlayıcısını ve değerlerini getirin (kek durumunda önce kasenizde ihtiyacınız olacak gerekli malzemeler). Diğer tablolardan gelen tüm bilgiler, gerektiğinde / kullanıldığında getirilir.


8

Yavaş yüklenme? Basitçe, çocuk kayıtlarının hemen alınmadığı, ancak onlara erişmeye çalıştığınızda otomatik olarak getirildiği anlamına gelir.


4

Tembel yükleme, ilişkilendirmenin geri alınmasını ertelemenize veya getirme stratejisi üzerinde daha iyi bir denetime sahip olmanıza olanak tanır.

EAGER yüklemesini kullandığınızda, sorgu zamanında geçersiz kılınamayacak bir genel getirme planı tanımlarsınız, yani varlık modelinizi tasarlarken aldığınız bir kararla sınırlısınız demektir. EAGER getiriliyor kod koku nedir getiriliyor strateji sorgu zamanı ilkesi olduğunu ve başka bir iş kullanım durumunda farklı olabilir çünkü.

Getirilirken strateji çok fazla EAGER getiriliyor ciddi performans ile ilgili sorunlara neden olabilir gibi çok önemli bir yönüdür.


3

Tembel ayar, Üst Nesne yüklenirken alt nesnelerin yüklenip yüklenmeyeceğine karar verir. Bu ayarı üst sınıfın ilgili hazırda bekleme eşleme dosyasını yapmanız gerekir.Lazy = true (alt öğeyi yüklememek anlamına gelir) Varsayılan olarak alt nesnelerin tembel yüklemesi doğrudur . Bu, üst nesnelerde açık olarak getChild () yöntemini çağırarak uygulamada açıkça çağrılmadığı sürece alt nesnelerin yüklenmediğinden emin olun. Bu durumda hazırda bekletme, üst öğe getChild () etkin olarak çağrıldığında alt öğeyi yüklemek için yeni bir veritabanı çağrısı verir Ancak bazı durumlarda üst öğe yüklendiğinde alt nesneleri yüklemeniz gerekir. Üst öğe veritabanından yüklendiğinde tembel = false ve hibernate öğenin yüklenmesini sağlayın.Exampleslazy = true (default) Kullanıcı sınıfının adres alt öğesi, sık gerekli değilse tembel yapılabilir.


2

Tembel yükleme, bir nesnenin başlatılmasını gereken noktaya kadar ertelemek için bilgisayar programlamasında yaygın olarak kullanılan bir tasarım modelidir. Doğru ve uygun şekilde kullanılırsa programın çalışmasında verimliliğe katkıda bulunabilir.

Vikipedi

Link Tembel Yükleniyor hibernate.org dan


1

Sadece bir sürü veriyi tek seferde yüklemek yerine şu anda ihtiyacınız olan verileri yüklemek anlamına gelir. Böylece uygulama yükleme süresini normalden daha hızlı hale getirir.


0

Hiberante hem varlıklar hem de koleksiyonlar için tembel başlatma özelliğini destekler. Hazırda bekletme motoru, yalnızca sorguladığımız nesneleri yükler, başka bir öğe veya koleksiyon oluşturmaz.

lazy = "false" varsayılan olarak yükleme başlatma başlatma tek çocuk için tembel.


0

Tembel ayar, Üst Nesne yüklenirken alt nesnelerin yüklenip yüklenmeyeceğine karar verir. Bu ayarı üst sınıfın ilgili hazırda bekleme eşleme dosyasını yapmanız gerekir. .


0

Şaşırtıcı bir şekilde, cevapların hiçbiri ekranların arkasındaki hazırda bekletme ile nasıl elde edildiği hakkında konuşmuyor.

Tembel yükleme , aşağıdaki teknikleri içeren performans nedenleriyle hazırda bekletme modunda etkili bir şekilde kullanılan bir tasarım modelidir.


1. Bayt kodu enstrümantasyonu :

Bu varlık nesnesine yapılan tüm çağrıları durdurmak için temel sınıf tanımını hazırda bekletme kancalarıyla geliştirir .

Derleme zamanında veya çalışma [yükleme] zamanında yapılır

1.1 Derleme süresi

  • Derleme sonrası işlem sonrası

  • Çoğunlukla maven / ant eklentileri tarafından

1.2 Çalışma süresi

  • Derleme zamanı enstrümantasyonu yapılmazsa, bu çalışma zamanında oluşturulur Javassist gibi kütüphaneler kullanılarak

2. Vekiller

Hazırda Bekletme'nin döndürdüğü varlık nesnesi, gerçek türde proxy'dir.

Ayrıca bakınız: Javasist. Ana fikir nedir ve gerçek kullanım nerede?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.