Apa Itu Algoritma Hi / Lo?

1. Perkenalan

Dalam tutorial ini, kami akan menjelaskan Algoritma Hi / Lo. Ini sebagian besar digunakan sebagai strategi pembuatan pengenal database .

Kami akan mulai dengan ikhtisar algoritme. Kemudian, kami akan menunjukkan contoh praktis berdasarkan framework Hibernate. Terakhir, kita akan membahas kasus penggunaan algoritme, manfaatnya, dan kekurangannya.

2. Ikhtisar Algoritma Hi / Lo

2.1 Definisi

Tujuan utama dari algoritma Hi / Lo adalah untuk membuat kisaran angka yang dapat digunakan dengan aman sebagai pengenal database . Untuk melakukan itu, ia menggunakan tiga variabel angka yang biasa disebut tinggi, rendah , dan incrementSize .

The incrementSize variabel memegang jumlah maksimum pengidentifikasi yang dapat dihasilkan dalam satu batch. Ini harus diperlakukan sebagai nilai konstan yang ditentukan di awal algoritma. Modifikasi runtime apa pun dapat menyebabkan masalah serius dalam lingkungan di mana beberapa klien menggunakan konfigurasi Hi / Lo yang sama untuk mempertahankan entri.

The tinggi variabel biasanya ditugaskan dari urutan basis data. Dalam hal ini, kami yakin tidak ada yang akan mendapatkan nomor yang sama dua kali.

The rendah variabel memegang jumlah saat ini ditugaskan di kisaran [0 , incrementSize ).

Dengan poin-poin ini, algoritma Hi / Lo menghasilkan nilai dalam range [( hi - 1) * incrementSize + 1 , ( hi * incrementSize )).

2.2 Pseudocode

Mari kita lihat langkah-langkah untuk menghasilkan nilai baru menggunakan algoritma Hi / Lo:

  • jika rendah lebih besar dari atau sama dengan incrementSize , tetapkan nilai baru ke tinggi dan setel ulang rendah ke 0
  • menghasilkan nilai baru dengan rumus: ( high - 1) * incrementSize + low
  • kenaikan rendah sebesar 1
  • mengembalikan nilai yang dihasilkan

3. Contoh Praktis

Mari kita lihat algoritma Hi / Lo beraksi. Untuk melakukan itu, kita akan menggunakan framework Hibernate dan implementasi Hi / Lo-nya.

Pertama, mari kita tentukan entitas database untuk digunakan:

@Entity public class RestaurantOrder { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hilo_sequence_generator") @GenericGenerator( name = "hilo_sequence_generator", strategy = "sequence", parameters = { @Parameter(name = "sequence_name", value = "hilo_seqeunce"), @Parameter(name = "initial_value", value = "1"), @Parameter(name = "increment_size", value = "3"), @Parameter(name = "optimizer", value = "hilo") } ) private Long id; }

Ini adalah pesanan restoran sederhana dengan satu bidang id . Untuk menentukan algoritma Hi / Lo dengan benar dalam Hibernate, dalam definisi field id , kita harus memilih strategi urutan - pengoptimal hilo - dan menentukan parameter increment_size .

Untuk menunjukkan cara kerja algoritma Hi / Lo, kami akan mempertahankan sembilan pesanan restoran dalam satu putaran:

public void persist() { Transaction transaction = session.beginTransaction(); for (int i = 0; i < 9; i++) { session.persist(new RestaurantOrder()); session.flush(); } transaction.commit(); }

Menurut ukuran kenaikan yang ditentukan dalam entitas, kita seharusnya hanya memiliki tiga panggilan ke database untuk nilai tinggi berikutnya . Dengan asumsi urutan database dimulai dari 1, batch pertama dari pengidentifikasi yang dihasilkan akan berada dalam kisaran [1,3].

Ketika algoritma Hi / Lo mengembalikan 3 dan Hibernate meminta nilai pengenal berikutnya, nilai variabel rendah sama dengan konstanta incrementSize . Dalam hal ini, panggilan berikutnya ke database untuk nilai tinggi baru harus dilakukan. Memiliki 2 sebagai nilai tinggi baru , algoritma menghasilkan nilai dalam kisaran [4,6].

Akhirnya, panggilan terakhir ke database untuk nilai tinggi berikutnya dibuat, dan nilai dalam rentang [7, 9] ditetapkan ke entitas.

Log hibernasi yang diambil selama eksekusi metode persist () mengkonfirmasi nilai-nilai tersebut:

Hibernate: call next value for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sequence value obtained: 1 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 1, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 2, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 3, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator Hibernate: call next value for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sequence value obtained: 2 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 4, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 5, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 6, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator Hibernate: call next value for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sequence value obtained: 3 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 7, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 8, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 9, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator

4. Manfaat dan Kerugian Algoritma

Keuntungan utama dari algoritma Hi / Lo adalah berkurangnya jumlah panggilan database untuk nilai urutan berikutnya. Meningkatkan nilai incrementSize mengurangi jumlah perjalanan bolak-balik ke database. Jelas, itu berarti peningkatan kinerja dalam aplikasi kita. Selain itu, algoritma Hi / Lo adalah pilihan yang lebih disukai di lingkungan dengan koneksi Internet yang lemah .

Di sisi lain, algoritma Hi / Lo bukanlah pilihan terbaik di lingkungan di mana beberapa klien yang berbeda menyimpan data ke tabel yang sama dalam database . Aplikasi pihak ketiga mungkin tidak mengetahui strategi Hi / Lo yang kami gunakan untuk membuat pengenal. Akibatnya, mereka mungkin menggunakan id entitas dari rentang angka yang dihasilkan yang digunakan saat ini dalam aplikasi kita. Dalam hal ini, saat menyimpan data, kami mungkin mengalami kesalahan yang sulit diperbaiki.

5. Kesimpulan

Dalam tutorial ini, kita membahas algoritma Hi / Lo.

Pertama, kami menjelaskan cara kerjanya dan membahas implementasi pseudocode-nya. Kemudian, kami menunjukkan contoh praktis menggunakan implementasi algoritma Hibernate. Terakhir, kami membuat daftar keuntungan dan kerugian Hi / Lo.

Seperti biasa, kode yang ditampilkan dalam artikel ini tersedia di GitHub.