Hi/Lo algoritması Sıralı ve sonsuz değerden oluşan lineer bir kümede , Low değerlerin High değerler tarafından bölünüp sınıflandırılmasına dayalı bir algoritmadır. Her High değer için Low kadar değer ayırılır. Low değerlerin sınırlarını belirlemek için maxLow değeri kullanılır. Yeni bir high değer için ilk low değerin belirlenmesi : High X (maxLow + 1 ) Örnek olarak aşağıdaki değerleri verelim maxLow= 0 High = 0 -> başlangıç Low = 0 - > High değerin tanımladığı Low değer sayısı - 101 High = 1 -> başlangıç Low = 101 - > High değerin tanımladığı Low değer sayısı - 101 High =2 -> başlangıç Low = 202 - > High değerin tanımladığı Low değer sayısı - 101 Bu algoritmadaki terimleri High domain - low domain olarak düşünmek de anlamanıza yardımcı olabilir . Hibernate Hilo Generator Hibernate kütüphanesinde , persist etmek istediğimiz yeni nesnelerin id'sinin oluşması için seçebileceğiniz bir çok Generator sınıfı var. Her nesnenin kendi ID generator ını seçmek mümkün. Hi/Lo generator da bunlardan biri(kaynak kod). net.sf.hibernate.id.IdentifierGenerator interface ini implemente ederek (çok basit bir interface) kendi generator ınızı da yazabilirsiniz. Persist etmek istediğiniz entity'nin "hbm.xml" dosyasında , <id> tag inin altında , <generator> tag ında gerekli değişiklikleri yaparak , kolayca Hi/Lo generator ı kullanıma alabilirsiniz.Aşağıdaki örnek kod üzerinden gidelim. [xml] <generator class="hilo"> // default olarak "identity" gelir. Burada generator class ımızı "hilo" olarak belirtiyoruz. <param name="table">ornekTablo</param> // High değer için hangi bakılacak tablo <param name="column">ornekKolon</param> // High değer için bakılacak kolon <param name="max_lo">100</param> // maxLow değeri </generator> [/xml] Eğer tablo parametresini vermezseniz defualt olarak hibernate_unique_key , eğer kolon parametresini vermezseniz default olarak next_hi , eğer max_lo parametresini vermezseniz default olarak 32767 (java short.MAX_VALUE) kullanılır. Örnek bir çalışma döngüsü : Hilo generator kullanan bir entity nin bir instance ını persist etmek istediğinizde (session.save()) , hilo generator , ornekTablo nun ilk satırının ornekKolon undaki integer() değeri okur ve bir arttırıp geri yazar ; yani o High değeri kendine ayırır. Daha sonra Hilo algoritması ile başlangıç Low değerini bulur. Ve bu değer , persist etmek istediğimiz instance ın Id değeri olur. Aynı entity den bir instance daha save etmek istediğimizde , en son kullanılmış Low değer bir arttırılır. Bu döngü , max_lo kadar tekrar eder. max_lo kadar Low değeri kullanıldıktan sonra , en baştaki işleme dönülüp yeni bir High değeri alınır. Notlar :
- hilo generator , max_lo değeri kadar instance ı persist etmek için , sadece bir defa database bağlantısı kullanır. identity ise max_lo kadar(doğru max_lo değeri ile birleşince çok büyük performans kazancı sağlar).
- hilo generator offline olarak çalışabilir . High değerini aldıktan sonra , bir dahaki high değeri ihtiyacına kadar , bağlantı yapmaz.
- max_lo değerini iyi belirlemek gerekir. max_lo değeri ne kadar yüksek ise , database lookup sayısı o kadar azalır. Fakat batch işlemlerde , batch boyutunun bir o kadar büyümesine izin verir ve o kadar yüksek bellek kullanılır.
Bir cevap yazın