Aja nulis solusi cache sampeyan

Cara liya kanggo nyepetake karya karo database yaiku cache obyek sing wis dijaluk sadurunge.

Penting! Aja nulis solusi caching dhewe. Tugas iki duwe akeh pitfalls sing ora tau ngimpi.

Jeksa Agung bisa ngetokake 1 - cache flush . Kadhangkala kedadeyan kedadeyan nalika obyek kudu dibusak saka cache utawa dianyari ing cache. Siji-sijine cara kanggo nindakake iki kanthi cekap yaiku ngirim kabeh panjaluk menyang database liwat mesin cache. Yen ora, saben-saben sampeyan kudu ngandhani cache kanthi jelas babagan obyek sing kudu dibusak utawa dianyari.

Masalah 2 - kurang memori . Caching katon kaya ide sing apik nganti sampeyan nemokake manawa obyek ing memori njupuk akeh ruang. Sampeyan mbutuhake tambahan puluhan gigabyte memori supaya cache aplikasi server bisa digunakake kanthi efektif.

Lan amarga tansah ana kekurangan memori, perlu strategi efektif kanggo mbusak obyek saka cache. Iki rada mirip karo tukang sampah ing Jawa. Lan nalika sampeyan ngelingi, pirang-pirang dekade, pikiran sing paling apik wis nyipta macem-macem cara kanggo menehi tandha obyek miturut generasi, lsp.

Masalah 3 - macem-macem strategi . Minangka laku nuduhake, Sastranegara beda kanggo nyimpen lan nganyari ing cache efektif kanggo obyek beda. Sistem caching efisien ora bisa nindakake mung siji strategi kanggo kabeh obyek.

Masalah 4 - Panyimpenan sing efisien saka . Sampeyan ora bisa mung nyimpen obyek ing cache. Obyek kerep banget ngemot referensi kanggo obyek liyane, lan liya-liyane. Ing tingkat iki, sampeyan ora butuh tukang sampah: mung ora ana sing bisa dicopot.

Mulane, tinimbang nyimpen obyek kasebut, kadhangkala luwih efisien kanggo nyimpen nilai-nilai lapangan primitif. Lan sistem kanggo cepet mbangun obyek adhedhasar mau.

Akibaté, sampeyan bakal entuk kabeh DBMS virtual ing memori, sing kudu bisa cepet lan nggunakake memori sing sithik.

Caching database

Saliyane caching langsung ing program Java, caching asring diatur langsung ing database.

Ana papat pendekatan gedhe:

Pendekatan pisanan yaiku denormalisasi basis data . Server SQL nyimpen data ing memori beda karo cara disimpen ing tabel.

Nalika data disimpen ing disk ing tabel, asring banget pangembang nyoba ngindhari duplikasi data sabisa - proses iki diarani normalisasi database. Dadi, kanggo nyepetake karya karo data ing memori, proses mbalikke ditindakake - denormalisasi database. Sekelompok tabel sing gegandhengan wis bisa disimpen ing wangun gabungan - ing wangun tabel gedhe, lsp.

Pendekatan kapindho yaiku query cache . Lan asil pitakon.

DBMS ndeleng manawa panjaluk sing padha utawa padha asring teka. Banjur mung miwiti cache panjalukan kasebut lan tanggapane. Nanging ing wektu sing padha, sampeyan kudu nggawe manawa baris sing wis diganti ing database dibusak saka cache ing proses pas wektune.

Pendekatan iki bisa dadi efektif banget karo manungsa sing bisa nganalisa pitakon lan mbantu DBMS nemtokake cara paling apik kanggo cache.

Pendekatan katelu yaiku database ing memori .

Pendekatan liyane sing umum digunakake. Database liyane diselehake ing antarane server lan DBMS, sing nyimpen kabeh data mung ing memori. Iki uga disebut In-Memory-DB. Yen sampeyan duwe akeh server beda ngakses database padha, banjur nggunakake In-Memory-DB sampeyan bisa ngatur caching adhedhasar jinis server tartamtu.

Tuladha:

Pendekatan 4 - kluster database . Sawetara basis mung diwaca.

Solusi liyane yaiku nggunakake kluster: sawetara DBMS saka jinis sing padha ngemot data sing padha. Ing wektu sing padha, sampeyan bisa maca data saka kabeh database, lan nulis mung siji. Sing banjur disinkronake karo database liyane.

Iki minangka solusi sing apik banget amarga gampang diatur lan bisa digunakake ing praktik. Biasane, kanggo siji panjalukan kanggo database kanggo ngganti data, 10-100 panjalukan kanggo maca data teka.

Jinis caching ing Hibernate

Hibernate ndhukung telung tingkat caching:

  • Caching ing tingkat sesi (Sesi)
  • Caching ing tingkat SessionFactory
  • Panjaluk cache (lan asile)

Sampeyan bisa nyoba kanggo makili sistem iki ing wangun kuwi:

Jinis caching sing paling gampang (uga disebut cache tingkat pertama ) dileksanakake ing tingkat sesi Hibernate. Hibernate tansah nggunakake cache iki minangka standar lan ora bisa dipateni .

Ayo langsung nimbang conto ing ngisor iki:

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

assertTrue(director1 == director2);

Katon yen rong pitakon menyang database bakal ditindakake ing kene, nanging ora kaya ngono. Sawise panjalukan pisanan kanggo database, obyek Karyawan bakal cached. Lan yen sampeyan takon obyek maneh ing sesi sing padha, Hibernate bakal ngasilake obyek Jawa sing padha.

Objek sing padha tegese malah referensi obyek bakal padha. Iku pancene obyek sing padha.

Metode save() , update() , saveOrUpdate() , load() , get() , list() , iterate() , lan scroll() bakal nggunakake cache tingkat pertama. Bener, ora ana sing kudu ditambahake.

Caching tingkat kapindho

Yen cache tingkat pisanan kaiket menyang obyek sesi, banjur cache tingkat kapindho kaiket menyang obyek sesi.SessionFactory. Tegese visibilitas obyek ing cache iki luwih akeh tinimbang ing cache tingkat pertama.

Tuladha:

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

Ing conto iki, rong pitakon bakal digawe menyang database. Hibernate bakal ngasilake obyek sing padha, nanging ora bakal dadi obyek sing padha - bakal duwe referensi sing beda.

Caching tingkat kapindho dipateni kanthi gawan . Mulane, kita duwe rong pitakon menyang database tinimbang siji.

Kanggo ngaktifake, sampeyan kudu nulis baris ing ngisor iki ing file hibernate.cfg.xml:

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

Sawise ngaktifake cache tingkat kapindho, prilaku Hibernate bakal rada owah:

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

Mung sawise kabeh manipulasi kasebut, cache tingkat kapindho bakal diaktifake, lan ing conto ing ndhuwur, mung siji pitakon menyang basis data sing bakal ditindakake.