Strategi Konkurensi
Setelah Anda mengaktifkan caching tingkat kedua di Hibernate, Anda perlu menjelaskan kepada Hibernate objek Entitas mana yang ingin kita cache dan bagaimana caranya.
Untuk melakukan ini, Hibernate memiliki anotasi khusus untuk kelas Entity - @Cache . Contoh:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
Anotasi ini perlu ditulis untuk setiap entitas Entitas yang ingin kita gunakan cache tingkat kedua. Contoh:
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
private Set<Task> tasks;
}
Hibernasi memiliki 4 kemungkinan strategi akses untuk entitas yang di-cache jika diakses dari utas yang berbeda:
- hanya baca
- Baca tulis
- nonstrict-read-write
- transaksional
Baca -saja. Strategi konkurensi sesuai data yang tidak pernah berubah. Hibernasi hanya akan menyimpan objek-objek ini di memorinya. Gunakan hanya untuk data referensi.
Database menyimpan banyak informasi yang tidak pernah berubah. Misalnya, tabel menyimpan daftar acara yang hanya ditambahkan tetapi tidak pernah diubah atau dihapus. Jika Anda perlu bekerja dengan tabel ini melalui Hibernate, maka strategi caching read-only akan cocok untuk Anda.
Baca-tulis (baca-tulis). Gunakan strategi ini untuk data yang mudah dibaca. Namun, Hibernate akan melacak upaya untuk mengubah data ini, meskipun diharapkan sangat jarang.
Anda perlu melakukan cache terutama pada objek yang jarang berubah dan sering dibaca / diminta. Jika Anda memiliki objek seperti itu, maka Anda perlu menggunakan strategi baca-tulis untuk objek tersebut.
Nonstrict-read-write . Strategi ini tidak menjamin konsistensi antara cache dan database. Gunakan strategi ini jika data hampir tidak pernah berubah dan kemungkinan kecil data basi bukanlah masalah kritis.
Berbeda dengan strategi baca-tulis, strategi ini mengasumsikan bahwa data yang dapat diubah tidak dikunci untuk dibaca. Hal ini dapat mengakibatkan objek diubah di satu tempat, sementara di tempat lain, seseorang membaca versi lamanya.
Misalnya, seorang pengguna telah mengubah komentarnya, tetapi pengguna lain masih melihat versi lamanya selama beberapa waktu. Jika ini bukan masalah bagi Anda, maka gunakan strategi nonstrict-read-write.
Transaksional . Gunakan strategi ini terutama untuk data hanya-baca yang penting untuk mencegah data basi dalam transaksi bersamaan pada kesempatan pembaruan yang jarang terjadi.
Menyimpan data dalam cache
Detail penting lainnya tentang cache level kedua yang harus Anda ingat adalah bahwa Hibernate tidak menyimpan sendiri objek kelas Anda. Ini menyimpan informasi sebagai array string, angka, dll.
Dan pengidentifikasi objek bertindak sebagai penunjuk ke informasi ini. Secara konseptual, ini seperti Peta, di mana id objek adalah kuncinya, dan array data adalah nilainya. Anda bisa membayangkannya seperti ini:
1 -> { "Ivanov", 1, null , {1,2,5} }
2 -> { "Petrov", 2, null , {1,2,5} }
3 -> { "Sidorov", 3, null , {1,2,5} }
Yang sangat masuk akal mengingat berapa banyak memori ekstra yang digunakan setiap objek.
Selain hal di atas, Anda harus ingat bahwa dependensi kelas Entitas Anda juga tidak di-cache secara default. Misalnya, jika kita mempertimbangkan kelas di atas, Employee , maka saat mengambil, kumpulan tugas akan diambil dari database , dan bukan dari cache tingkat kedua .
Jika Anda juga ingin men-cache dependensi, maka kelas akan terlihat seperti ini:
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<Task> tasks;
}
Dan detail terakhir - membaca dari cache tingkat kedua hanya terjadi jika objek yang diinginkan tidak ditemukan di cache tingkat pertama.
Mode Cache
Hibernasi memungkinkan manajemen caching yang sangat fleksibel. Anda dapat mengatur mode cache untuk setiap sesi individual atau bahkan untuk setiap permintaan database.
Ada lima mode seperti itu:
- MENDAPATKAN
- MENGABAIKAN
- NORMAL
- MELETAKKAN
- MENYEGARKAN
Tabel di bawah ini menggambarkan pekerjaan mereka:
Mode Cache | Keterangan |
---|---|
MENDAPATKAN | Data dibaca dari cache tetapi tidak ditambahkan ke dalamnya. |
MENGABAIKAN | Sesi tidak berinteraksi dengan cache. |
NORMAL | Data dibaca dari cache dan ditambahkan ke dalamnya. |
MELETAKKAN | Data tidak pernah diambil dari cache, tetapi ditambahkan ke dalamnya. |
MENYEGARKAN | Data tidak pernah diambil dari cache, tetapi ditambahkan ke dalamnya. Dalam mode ini, pengaturan hibernate.cache.use_minimal_puts juga digunakan. |
Contoh pengaturan mode cache untuk suatu sesi:
session.setCacheMode(CacheMode.GET);
Employee director = session.createQuery("from Employee where id = 4").uniqueResult();
Dan juga contoh pengaturan mode untuk sesi dan permintaan:
session.setCacheMode(CacheMode.GET);
Query query = session.createQuery("from Employee where id = 4");
query.setCacheMode(CacheMode.IGNORE); // Ignore cache work for this request
Employee director = query.uniqueResult();