Strategi Konkurensi

Selepas anda mendayakan caching peringkat kedua dalam Hibernate, anda perlu menerangkan kepada Hibernate objek Entiti yang ingin kami cache dan caranya.

Untuk melakukan ini, Hibernate mempunyai anotasi khas untuk kelas Entiti - @Cache . Contoh:

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

Anotasi ini perlu ditulis untuk setiap entiti Entiti yang kami mahu gunakan cache tahap kedua. Contoh:

@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
    @Id
    private Integer id;
    private Set<Task> tasks;
}

Hibernate mempunyai 4 kemungkinan strategi akses untuk entiti cache jika ia diakses daripada urutan yang berbeza:

  • baca sahaja
  • baca tulis
  • tidak ketat-baca-tulis
  • transaksional

Baca -sahaja. Strategi konkurensi yang sesuai dengan data yang tidak pernah berubah. Hibernate hanya akan menyimpan objek ini dalam ingatannya. Gunakannya untuk data rujukan sahaja.

Pangkalan data menyimpan banyak maklumat yang tidak pernah berubah. Sebagai contoh, jadual menyimpan senarai acara yang hanya ditambah tetapi tidak pernah diubah atau dialih keluar. Jika anda perlu bekerja dengan jadual ini melalui Hibernate, maka strategi caching baca sahaja akan sesuai dengan anda.

Baca-tulis (baca-tulis). Gunakan strategi ini untuk data yang boleh dibaca terutamanya. Walau bagaimanapun, Hibernate akan menjejaki percubaan untuk menukar data ini, walaupun ia menjangkakan ia sangat jarang berlaku.

Anda perlu cache terutamanya objek yang jarang berubah dan sering dibaca / diminta. Jika anda mempunyai objek sedemikian, maka anda perlu menggunakan strategi baca-tulis untuknya.

Tidak ketat-baca-tulis . Strategi ini tidak menjamin konsistensi antara cache dan pangkalan data. Gunakan strategi ini jika data hampir tidak pernah berubah dan kemungkinan kecil data basi bukanlah isu kritikal.

Tidak seperti strategi baca-tulis, strategi ini menganggap bahawa data boleh ubah tidak dikunci untuk dibaca. Ini boleh menyebabkan objek ditukar di satu tempat, manakala di tempat lain, seseorang sedang membaca versi lamanya.

Contohnya, pengguna telah menukar ulasannya, tetapi pengguna lain masih melihat versi lamanya untuk beberapa lama. Jika ini bukan masalah untuk anda, maka gunakan strategi bukan ketat-baca-tulis.

Transaksional . Gunakan strategi ini untuk terutamanya data baca sahaja yang penting untuk mengelakkan data basi dalam urus niaga serentak pada kejadian yang jarang berlaku untuk kemas kini.

Menyimpan data dalam cache

Satu lagi butiran penting tentang cache tahap kedua yang perlu anda ingat ialah Hibernate tidak menyimpan objek kelas anda sendiri. Ia menyimpan maklumat sebagai tatasusunan rentetan, nombor, dsb.

Dan pengecam objek bertindak sebagai penunjuk kepada maklumat ini. Dari segi konsep, ini adalah sesuatu seperti Peta, di mana id objek adalah kuncinya, dan tatasusunan data ialah nilainya. Anda boleh bayangkan 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 munasabah memandangkan berapa banyak memori tambahan yang digunakan oleh setiap objek.

Sebagai tambahan kepada perkara di atas, anda harus ingat bahawa kebergantungan kelas Entiti anda juga tidak dicache secara lalai. Sebagai contoh, jika kita menganggap kelas di atas, Pekerja , maka apabila mengambil, koleksi tugas akan diambil daripada pangkalan data dan bukan daripada cache peringkat kedua .

Jika anda ingin menyimpan kebergantungan cache juga, maka kelas itu sepatutnya kelihatan 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 perincian terakhir - membaca dari cache peringkat kedua berlaku hanya jika objek yang dikehendaki tidak ditemui dalam cache peringkat pertama.

CacheMode

Hibernate membenarkan pengurusan caching yang sangat fleksibel. Anda boleh menetapkan mod cache untuk setiap sesi individu atau bahkan untuk setiap permintaan pangkalan data.

Terdapat lima mod sedemikian:

  • DAPATKAN
  • ABAI
  • BIASA
  • LETAK
  • SEGARKAN

Jadual di bawah menerangkan kerja mereka:

CacheMode Penerangan
DAPATKAN Data dibaca daripada cache tetapi tidak ditambah kepadanya.
ABAI Sesi tidak berinteraksi dengan cache.
BIASA Data dibaca dari cache dan ditambahkan padanya.
LETAK Data tidak pernah diambil daripada cache, tetapi ditambahkan padanya.
SEGARKAN Data tidak pernah diambil daripada cache, tetapi ditambahkan padanya. Dalam mod ini, tetapan hibernate.cache.use_minimal_puts digunakan sebagai tambahan.

Contoh menetapkan mod cache untuk sesi:

session.setCacheMode(CacheMode.GET);
Employee director = session.createQuery("from Employee where id = 4").uniqueResult();

Dan juga contoh menetapkan mod 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();