Strategi Konkurensi

Sawise sampeyan ngaktifake cache tingkat kapindho ing Hibernate, sampeyan kudu nerangake kanggo Hibernate obyek Entitas sing pengin di-cache lan kepiye carane.

Kanggo nindakake iki, Hibernate duwe anotasi khusus kanggo kelas Entitas - @Cache . Tuladha:

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

Anotasi iki kudu ditulis kanggo saben entitas Entitas sing pengin digunakake cache tingkat kapindho. Tuladha:

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

Hibernate duwe 4 kemungkinan strategi akses kanggo entitas sing di-cache yen diakses saka benang sing beda:

  • namung diwaca
  • maca-nulis
  • nonstrict-maca-nulis
  • transaksional

Waca -mung. Strategi konkurensi sing cocog karo data sing ora bakal diganti. Hibernate mung bakal nyimpen obyek kasebut ing memori. Gunakake kanggo data referensi mung.

Database nyimpen akeh informasi sing ora owah. Contone, tabel nyimpen dhaptar acara sing mung ditambahake nanging ora tau diganti utawa dibusak. Yen sampeyan kudu nggarap tabel iki liwat Hibernate, strategi caching mung diwaca bakal cocog karo sampeyan.

Maca-nulis (maca-nulis). Gunakake strategi iki kanggo data sing utamané bisa diwaca. Nanging, Hibernate bakal nglacak upaya kanggo ngganti data iki, sanajan ngarepake data kasebut arang banget.

Sampeyan kudu cache utamane obyek sing arang diganti lan asring diwaca / dijaluk. Yen sampeyan duwe obyek kasebut, sampeyan kudu nggunakake strategi maca-tulis kanggo wong-wong mau.

Nonstrict-read-write . Strategi iki ora njamin konsistensi antarane cache lan database. Gunakake strategi iki yen data meh ora ngganti lan cilik kasempatan data basi ora masalah kritis.

Ora kaya strategi maca-tulis, strategi iki nganggep yen data sing bisa diowahi ora dikunci kanggo diwaca. Iki bisa nyebabake obyek kasebut diganti ing sak panggonan, dene ing liyane, ana sing maca versi lawas.

Contone, pangguna wis ngganti komentare, nanging pangguna liyane isih ndeleng versi lawas kanggo sawetara wektu. Yen iki ora dadi masalah kanggo sampeyan, gunakake strategi nonstrict-read-write.

Transaksional . Gunakake strategi iki kanggo utamané diwaca-mung data ngendi iku penting kanggo nyegah data stale ing transaksi bebarengan ing wusana langka saka nganyari.

Nyimpen data ing cache

Rincian penting liyane babagan cache tingkat kapindho sing kudu sampeyan eling yaiku Hibernate ora nyimpen obyek kelas sampeyan dhewe. Iku nyimpen informasi minangka susunan strings, nomer, etc.

Lan pengenal obyek tumindak minangka pointer kanggo informasi iki. Secara konseptual, iki kaya Peta, ing ngendi id obyek minangka kunci, lan susunan data minangka nilai. Sampeyan bisa mbayangno kaya iki:

1 -> { "Ivanov", 1, null , {1,2,5} }
2 -> { "Petrov", 2, null , {1,2,5} }
3 -> { "Sidorov", 3, null , {1,2,5} }

Kang banget cukup considering pinten memori ekstra saben obyek njupuk munggah.

Saliyane ing ndhuwur, sampeyan kudu ngelingi yen dependensi kelas Entitas sampeyan uga ora di-cache minangka standar. Contone, yen kita nimbang kelas ndhuwur, Karyawan , banjur nalika njupuk, koleksi tugas bakal dijupuk saka database , lan ora saka cache tingkat kapindho .

Yen sampeyan pengin cache dependensi uga, banjur kelas kudu katon kaya iki:

@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;
}

Lan rincian pungkasan - maca saka cache tingkat kapindho mung yen obyek sing dikarepake ora ditemokake ing cache tingkat pertama.

CacheMode

Hibernate ngidini manajemen caching sing fleksibel banget. Sampeyan bisa nyetel mode cache kanggo saben sesi individu utawa malah kanggo saben request database.

Ana limang mode kasebut:

  • GET
  • NGALAI
  • NORMAL
  • NDEKEK
  • REFRESH

Tabel ing ngisor iki nggambarake karyane:

CacheMode Katrangan
GET Data diwaca saka cache nanging ora ditambahake.
NGALAI Sesi ora sesambungan karo cache.
NORMAL Data diwaca saka cache lan ditambahake.
NDEKEK Data ora tau dijupuk saka cache, nanging ditambahake.
REFRESH Data ora tau dijupuk saka cache, nanging ditambahake. Ing mode iki, setelan hibernate.cache.use_minimal_puts tambahan digunakake.

Conto nyetel mode cache kanggo sesi:

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

Lan uga conto nyetel mode kanggo sesi lan panyuwunan:

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();