JavaRush /Kurslar /All lectures for UZ purposes /Hibernate'da ma'lumotlarni keshlash

Hibernate'da ma'lumotlarni keshlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

Hech qachon o'zing keshlash yechimini yozma

Ma'lumotlar bazasi bilan ishlashni tezlashtirishning yana bir usuli - avval so'ralgan obyektlarni keshda saqlash.

Bu juda muhim! Hech qachon o'zing keshlash yechimini yozma. Bu masala juda ko'p yashirin qiyinchiliklarga ega.

Muammo 1 — keshni tozalash. Ba'zida keshdan obyektni olib tashlash yoki uni yangilash kerak bo'lgan hodisalar sodir bo'ladi. Buni to'g'ri qilishning yagona yo'li - barcha ma'lumotlar bazasi so'rovlarini kesh dvigatelidan o'tkazishdir. Aks holda, har safar qaytadan keshga qaysi obyeklar olib tashlanishi yoki yangilanishi kerakligini ko'rsatishing kerak.

Muammo 2 — xotira yetishmasligi. Keshni saqlash ajoyib g'oya bo'lib ko'rinadi, agar xotirada saqlanayotgan obyektlar juda ko'p joy egallashini hisobga olmaganda. Keshning samarali ishlashi uchun qo'shimcha o'n gigabayt xotira kerak bo'ladi.

Xotira har doim yetarli emasligi sababli, keshdan obyektlarni olib tashlashning samarali strategiyasi zarurdir. Bu Java'dagi axlat yig'uvchini eslatadi. Va esingizda bo'lsa, allaqachon o'nlab yillardirki, eng yaxshi fikrlar obyektlarni avlodlar bo'yicha belgilash va h.k. usullarini ixtiro qilishmoqda.

Muammo 3 — turli xil strategiyalar. Tajriba ko'rsatadiki, har xil obyektlar uchun keshda saqlash va yangilashning turli strategiyalari samarali. Samarali keshlash tizimi barcha obyetkilar uchun bitta strategiya bilan cheklanmasligi mumkin.

Muammo 4 — obyektlarni samarali saqlash. Obyektlarni oddiygina keshda saqlab bo'lmaydi. To'liq obyektlar ko'pincha boshqa obyetklarga havolalar va h.k. saqlaydi. Tez orada axlat yig'uvchiga hech narsa qoldirmaysiz: uni oddiygina olib tashlash uchun hech narsa bo'lmaydi.

Shuning uchun o'zlari obyektlarni saqlash o'rniga, ba'zida ularning maydonlari-primivlari qiymatlarini saqlash ancha samarali bo'ladi. Va ularga asoslangan obyektlarni tezda yaratish tizimlari.

Oxirida siz tez ishlash va kam xotira iste'mol qilish uchun butun virtual SUBD'ga ega bo'lasiz.

Ma'lumotlar bazasida keshlash

Java dasturida to'g'ridan-to'g'ri keshlashdan tashqari, ko'pincha ma'lumotlar bazasida to'g'ridan-to'g'ri keshlashni tashkil qilishadi.

Bu yerda to'rt katta yondashuv mavjud:

Birinchi yondashuv — ma'lumotlar bazasini denormalizatsiya qilish. SQL server o'z xotirasida ma'lumotlarni jadvalda saqlanishidan boshqacha saqlaydi.

Diskda ma'lumotlar jadvallarda saqlanganda, ishlab chiqaruvchilar ko'pincha ma'lumotlarning takrorlanishining oldini olish uchun maksimal darajada normalizatsiyaga harakat qilishadi. Ma'lumotlar xotirada ishlashni tezlashtirish uchun teskari jarayon amalga oshiriladi — ma'lumotlar bazasini denormalizatsiya qilish. Ko'plab bog'langan jadvallar birlashgan holda saqlanishi mumkin — katta jadvallar shaklida va h.k.

Ikkinchi yondashuv — so'rovlarni keshlash. Va ularning natijalari.

SUBD ko'pincha unga bir xil yoki o'xshash so'rovlar kelayotganligini ko'radi. Shunda u shunchaki bu so'rovlarni va ularga javoblarni keshda saqlashni boshlaydi. Lekin shu vaqtning o'zida, keshdan ma'lumotlar bazasida o'zgargan satrlarni o'z vaqtida olib tashlanishiga aniqlik bilan e'tibor berish kerak.

Bu yondashuv odam ishtirokida juda samarali bo'lishi mumkin, u so'rovlarni tahlil qilib, SUBD'ga qanday qilib ularni yaxshiroq keshlashni tushunishga yordam bera oladi.

Uchinchi yondashuv — xotiradagi ma'lumotlar bazasi.

Shuningdek, tez-tez foydalaniladigan yondashuv. Server va SUBD o'rtasida barcha ma'lumotlarini faqat xotirada saqlaydigan yana bir baza qo'yiladi. Uni In-Memory-DB deb ham atashadi. Agar sizda ko'p turli serverlar bir ma'lumotlar bazasiga murojaat qilsa, In-Memory-DB orqali aniq server turiga mo'ljallangan keshlashni tashkil qilish mumkin.

Misol:

To'rtinchi yondashuv — ma'lumotlar bazasi klasteri. Bir nechta read-only bazalar.

Yana bir yechim — klasterdan foydalanish: bir xil turdagi bir nechta SUBD'lar bir xil ma'lumotlarni saqlaydi. Shu bilan birga, barcha bazadan ma'lumotlarni o'qish mumkin, lekin yozish faqat bitta bazada amalga oshiriladi. Keyin u boshqa bazalar bilan sinxronlashtiriladi.

Bu juda yaxshi yechim, chunki uni sozlash oson va u amaliyotda ishlaydi. Odatda, ma'lumotlar o'zgartirish so'rovi uchun bazaga 10-100 ta o'qish so'rovi keladi.

Hibernate'da keshlash turlari

Hibernate uch darajadagi keshlashni qo'llab-quvvatlaydi:

  • Sessiya darajasida keshlash (Session)
  • SessionFactory darajasida keshlash
  • So'rovlarni keshlash (va ularning natijalari)

Bu tizimlarni quyidagi rasmda tasvirlash mumkin:

Eng oddiy keshlash turi (uni yana birinchi darajali kesh deb ham atashadi) Hibernate sessiyasi darajasida amalga oshiriladi. Hibernate har doim bu keshdan foydalanadi va uni o'chirib bo'lmaydi.

Keling, darhol quyidagi misolni ko'rib chiqaylik:


Employee director1 = session.get(Employee.class, 4);
Employee director2 = session.get(Employee.class, 4);
 
assertTrue(director1 == director2);

Bu yerda ma'lumotlar bazasiga ikki marta so'rov beriladi deb o'ylashingiz mumkin, lekin bu to'g'ri emas. Birinchi marta ma'lumotlar bazasiga so'rov berilgandan keyin Employee obyekti keshda saqlanadi. Agar siz shu sessiyada yana obyekt so'rovini bajarsangiz, Hibernate sizga o'sha Java obyektini qaytaradi.

O'sha obyekt - bu shuni anglatadiki, hatto obyektlarga havolalar ham bir xil bo'ladi. Bu haqiqatda bitta va o'sha obyekt.

save(), update(), saveOrUpdate(), load(), get(), list(), iterate() va scroll() metodlaridan foydalanganda har doim birinchi darajali kesh ishtirok etadi. Bunga hech qanday qo'shimcha qilish kerak emas.

Ikkinchi darajadagi kesh

Agar birinchi darajali kesh sessiya obyektiga bog'langan bo'lsa, ikkinchi darajali kesh SessionFactory obyektiga bog'langan. Bu esa ikkinchi darajali keshdagi obyetklarning ko'rinishini birinchi darajali keshdan ancha kengroq qiladi.

Misol:


Session session = factory.openSession();
Employee director1 = session.get(Employee.class, 4);
session.close();
 
Session session = factory.openSession();
Employee director2 = session.get(Employee.class, 4);
session.close();
 
assertTrue(director1 != director2);
assertTrue(director1.equals(director2));

Ushbu misolda ma'lumotlar bazasiga ikki marta so'rov beriladi. Hibernate bir xil obyektlarni qaytaradi, lekin bu bir xil obyektlar emas - ular turli xil havolalarga ega bo'ladi.

Ikkinchi darajali keshlash odatiy ravishda o'chirilgan. Shu sababli, bir o'rniga ikkita ma'lumotlar bazasi so'rovi mavjud.

Uni yoqish uchun, hibernate.cfg.xml faylida quyidagi qatorlarni yozishingiz kerak:


<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>

Ikkinchi darajali keshlashni yoqqandan so'ng Hibernate'ning xulq-atvori biroz o'zgaradi:


Session session = factory.openSession();
Employee director1 = session.get(Employee.class, 4);
session.close();
 
Session session = factory.openSession();
Employee director2 = session.get(Employee.class, 4);
session.close();
 
assertTrue(director1 == director2);

Faqat ushbu jarayonlardan so'ng ikkinchi darajali keshlash yoqiladi va yuqoridagi misolda faqat bitta ma'lumotlar bazasi so'rovi bajariladi.

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