Ide dasarnya adalah Anda memiliki dua angka untuk membuat kunci utama - angka "tinggi" dan angka "rendah". Seorang klien pada dasarnya dapat meningkatkan urutan "tinggi", mengetahui bahwa ia kemudian dapat dengan aman menghasilkan kunci dari seluruh rentang nilai "tinggi" sebelumnya dengan berbagai nilai "rendah".
Misalnya, seandainya Anda memiliki urutan "tinggi" dengan nilai saat ini 35, dan angka "rendah" ada di kisaran 0-1023. Kemudian klien dapat menambah urutan ke 36 (untuk klien lain agar dapat menghasilkan kunci saat menggunakan 35) dan tahu bahwa kunci 35/0, 35/1, 35/2, 35/3 ... 35/1023 adalah semua tersedia.
Ini bisa sangat berguna (terutama dengan ORM) untuk dapat mengatur kunci utama di sisi klien, daripada memasukkan nilai tanpa kunci primer dan kemudian mengambilnya kembali ke klien. Selain dari hal lain, itu berarti Anda dapat dengan mudah membuat hubungan orang tua / anak dan memiliki kunci semuanya sebelum Anda melakukan sisipan apa pun , yang membuat mengelompokkannya menjadi lebih mudah.
Selain jawaban Jon:
Ini digunakan untuk dapat bekerja terputus. Seorang klien kemudian dapat meminta server untuk nomor hi dan membuat objek meningkatkan nomor lo itu sendiri. Tidak perlu menghubungi server sampai rentang lo habis.
sumber
Algoritma hi / lo membagi domain urutan menjadi grup "hi". Nilai "hi" ditetapkan secara sinkron. Setiap grup "hi" diberi jumlah entri "lo" maksimum, yang dapat ditetapkan secara off-line tanpa khawatir tentang entri duplikat bersamaan.
Rentang pengidentifikasi diberikan oleh rumus berikut:
dan nilai "lo" akan berada dalam kisaran:
sedang diterapkan dari nilai awal:
Ketika semua nilai "lo" digunakan, nilai "hi" baru diambil dan siklus berlanjut
Anda dapat menemukan penjelasan yang lebih rinci dalam artikel ini :
Dan presentasi visual ini juga mudah diikuti:
Meskipun optimizer hi / lo baik-baik saja untuk mengoptimalkan generasi pengidentifikasi, itu tidak cocok dengan sistem lain yang memasukkan baris ke dalam basis data kami, tanpa mengetahui apa pun tentang strategi pengidentifikasi kami.
Hibernate menawarkan optimizer pooled-lo , yang menawarkan keuntungan dari strategi generator hi / lo sambil juga memberikan interoperabilitas dengan klien pihak ketiga lainnya yang tidak mengetahui strategi alokasi urutan ini.
Menjadi efisien dan interoperable dengan sistem lain, optimizer pooled-lo adalah kandidat yang jauh lebih baik daripada strategi pengidentifikasi legacy hi / lo.
sumber
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "name") @SequenceGenerator(name="name", sequenceName = "name_seq", allocationSize=100)
ID saya., (hi * incrementSize) + 1)
... seharusnya, hi * incrementSize)
, kan?Lo adalah pengalokasi yang di-cache yang membagi ruang-ruang kunci menjadi potongan-potongan besar, biasanya didasarkan pada beberapa ukuran kata mesin, daripada rentang ukuran yang bermakna (misalnya mendapatkan 200 kunci sekaligus) yang mungkin bisa dipilih manusia dengan bijaksana.
Penggunaan Hi-Lo cenderung membuang sejumlah besar kunci pada restart server, dan menghasilkan nilai kunci besar yang tidak ramah manusia.
Lebih baik daripada pengalokasi Hi-Lo, adalah pengalokasi "Linear Chunk". Ini menggunakan prinsip berbasis tabel yang serupa tetapi mengalokasikan potongan kecil, berukuran nyaman & menghasilkan nilai ramah manusia yang bagus.
Untuk mengalokasikan berikutnya, katakanlah, 200 kunci (yang kemudian disimpan sebagai rentang di server & digunakan sesuai kebutuhan):
Asalkan Anda dapat melakukan transaksi ini (gunakan coba lagi untuk menangani pertikaian), Anda telah mengalokasikan 200 kunci & dapat mengeluarkannya sesuai kebutuhan.
Dengan ukuran chunk hanya 20, skema ini 10x lebih cepat daripada mengalokasikan dari urutan Oracle, dan 100% portabel di antara semua database. Kinerja alokasi setara dengan hi-lo.
Tidak seperti ide Ambler, ini memperlakukan ruang kunci sebagai garis angka linier yang berdekatan.
Ini menghindari dorongan untuk kunci komposit (yang tidak pernah benar-benar ide yang baik) dan menghindari pemborosan seluruh kata-kata ketika server restart. Ini menghasilkan nilai-nilai kunci "ramah" skala manusia.
Gagasan Mr Ambler, sebagai perbandingan, mengalokasikan bit 16- atau 32-bit yang tinggi, dan menghasilkan nilai-nilai kunci besar yang tidak ramah manusia sebagai kenaikan hi-words.
Perbandingan kunci yang dialokasikan:
Dari segi desain, solusinya secara mendasar lebih kompleks pada garis bilangan (kunci komposit, produk hi_word besar) daripada Linear_Chunk tanpa mencapai manfaat komparatif.
Desain Hi-Lo muncul lebih awal dalam pemetaan OO dan kegigihan. Saat ini kerangka kerja ketekunan seperti Hibernate menawarkan pengalokasi yang lebih sederhana dan lebih baik sebagai default.
sumber
Saya menemukan algoritma Hi / Lo sangat cocok untuk banyak database dengan skenario replikasi berdasarkan pengalaman saya. Bayangkan ini. Anda memiliki server di New York (alias 01) dan server lain di Los Angeles (alias 02) maka Anda memiliki tabel PERSON ... jadi di New York ketika seseorang membuat ... Anda selalu menggunakan 01 sebagai nilai HI dan nilai LO adalah rahasia kedua. misalnya por.
di Los Angeles Anda selalu menggunakan HI 02. misalnya:
Jadi, ketika Anda menggunakan replikasi basis data (apa pun mereknya), semua kunci primer dan data digabungkan dengan mudah dan alami tanpa harus khawatir tentang duplikat kunci primer, collision, dll.
Ini adalah cara terbaik untuk masuk dalam skenario ini.
sumber