JavaRush /Kurslar /All lectures for UZ purposes /Ikkinchi darajadagi keshlashni sozlash

Ikkinchi darajadagi keshlashni sozlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

Parallel kirishni boshqarish strategiyalari

Hibernate da ikkinchi darajadagi keshlashni yoqgandan keyin, Hibernate'ga qaysi Entity-obyektlarni keshlashimizni va qanday qilishimizni tushuntirishimiz kerak.

Buning uchun Hibernate da Entity-klasslar uchun maxsus annotatsiya mavjud — @Cache. Misol:


@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

Bu annotatsiyani har bir Entity-subb'ektga yozish kerak, agar biz ikkinchi darajadagi keshlashni ishlatmoqchi bo'lsak. Misol:


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

Hibernate da 4 xil kirish strategiyalari mavjud, agar bir xil ob'ektga turli oqimlar orqali murojaat qilinsa:

  • read-only
  • read-write
  • nonstrict-read-write
  • transactional

Faqar o'qish uchun (read-only). Bu parallelizm strategiyasi, ma'lumotlar hech qachon o'zgarmasligi uchun mos keladi. Hibernate bu obyektlarni oddiygina yodda saqlab turadi. Faqat ma'lumotnoma ma'lumotlar uchun foydalaning.

Ma'lumotlar omborlarida hech qachon o'zgarmaydigan juda ko'p ma'lumotlar mavjud. Masalan, faqat qo'shilayotgan, lekin hech qachon o'zgarmaydigan va o'chirilmaydigan voqealar ro'yxatini saqlaydigan jadval. Agar siz Hibernate orqali ushbu jadval bilan ishlashingiz kerak bo'lsa, read-only kesh strategiyasi mos keladi.

O'qish-yozish (read-write). Bu strategiyani asosan o'qish uchun mo'ljallangan ma'lumotlar uchun ishlat. Biroq, ma'lumotlar o'zgarishini kuzatib boradi, va bu kamdan-kam sodir bo'lishiga ishonadi.

Asosan oz o'zgaradigan va ko'p o'qiladigan/zapros qilinadigan obyektlarni keshlashtirish kerak. Agar sizda shunday obyektlar bo'lsa, ularga read-write strategiyasini qo'llang.

Nonstrict-read-write. Ushbu strategiya kesh va ma'lumotlar ombori orasidagi moslikni kafolatlamaydi. Agar ma'lumotlar deyarli hech qachon o'zgarmasa va eski ma'lumotlar muammo tug'dirmasa, ushbu strategiyani ishlat.

Read-write strategiyasidan farqli o'laroq, ushbu strategiya o'qish uchun ma'lumotlarni qulfga olishni talab qilmaydi. Bu shundan iboratki, ob'ekt bir joyda o'zgartirilgan, lekin boshqa bir joyda eski versiyasini o'qish imkoniyati mavjud.

Masalan, foydalanuvchi o'z izohini o'zgartirgan, lekin qolgan foydalanuvchilar hali ham eski versiyasini ko'rishadi. Agar bu siz uchun muammo bo'lmasa, nonstrict-read-write strategiyasini qo'llang.

Tranzaksion. Barcha o'qish uchun mo'ljallangan ma'lumotlar bo'yicha foydalaning, bu yerda parallel tranzaksiyalarda ma'lumotlarning eski bo'lishiga yo'l qo'ymaslik muhim hisoblanadi.

Keshda ma'lumotlarni saqlash

Ikkinchi darajadagi kesh haqida yana bir muhim ma'lumot — Hibernate sizning klasslaringizni obyektlarini saqlamaydi. U ma'lumotlarni satrlar, raqamlar kabi massiv sifatida saqlaydi.

Va obyekt identifikatori ushbu ma'lumotga ko'rsatmalar beradi. Bu kontseptual Map kabi, bunda obyektning id — kalit, va ma'lumotlar massivi — qiymat. Uni shunday tasavvur qilish mumkin:

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

Bu juda oqilona bo'lib, har bir obyekt keraksiz xotirani qancha saqlashini hisobga olsak.

Yuqorida aytib o'tilganlardan tashqari, Entity-klassingizning bog'lanishlari sukut bo'yicha keshlanmaydi. Masalan, agar yuqoridagi Employee klassini ko'rsak, tasks kolleksiyasi ma'lumotlar omboridan olinadi, lekin ikkinchi darajadagi keshdan emas.

Agar siz ham bog'lanishlarni keshlashni xohlasangiz, klass quyidagicha ko'rinishi kerak:


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

Va oxirgi detal — agar kerakli obyekt birinchi darajadagi keshta topilmagan bo'lsa, faqat ikkinchi darajadagi keshtan o'qiladi.

CacheMode

Hibernate keshlashni juda moslashuvchan boshqarishga imkon beradi. Har bir alohida sessiya yoki hatto ma'lumotlar omboridagi har bir so'rov uchun keshlash rejimini sozlashingiz mumkin.

Ushbu rejimlardan jami beshta mavjud:

  • GET
  • IGNORE
  • NORMAL
  • PUT
  • REFRESH

Quyidagi jadvalda ularning ishlashi tavsiflanadi:

CacheMode Ta'rifi
GET Ma'lumotlar keshdan o'qiladi, lekin unga qo'shilmaydi.
IGNORE Sessiya keshlash bilan o'zaro aloqada bo'lmaydi.
NORMAL Ma'lumotlar keshdan o'qiladi va unga qo'shiladi.
PUT Ma'lumotlar hech qachon keshdan olinmaydi, lekin unga qo'shiladi.
REFRESH Ma'lumotlar hech qachon keshdan olinmaydi, lekin unga qo'shiladi. Ushbu rejimda qo'shimcha ravishda hibernate.cache.use_minimal_puts sozlamasi ishlatiladi.

Seans uchun keshlash rejimini o'rnatish misoli:


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

Shuningdek, sessiya va so'rov uchun rejimni sozlash misoli:


session.setCacheMode(CacheMode.GET);
Query query = session.createQuery("from Employee where id = 4");
query.setCacheMode(CacheMode.IGNORE); // Ushbu so'rov uchun keshlash ishlamaydi
Employee director = query.uniqueResult();

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION