Menyediakan caching
Mari kembali ke tetapan caching kami dalam fail 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"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
Beri perhatian kepada baris pertama - ia mengandungi nama kelas enjin caching. Hibernate sebenarnya tidak melaksanakan caching secara dalaman, sebaliknya ia menyediakan satu set antara muka yang anda boleh melaksanakan enjin caching anda sendiri.
Pelaksanaan popular termasuk:
- EHCache
- OSCache
- SwarmCache
- JBoss TreeCache
EHCache
Ia boleh dicache dalam memori atau pada cakera, serta dalam caching kelompok, dan juga menyokong cache pilihan hasil pertanyaan Hibernate.
OSCache
Menyokong cache memori dan cakera dalam JVM yang sama dengan set dasar tamat tempoh yang kaya dan sokongan cache pertanyaan.
SwarmCache
Cache kluster berdasarkan JGroups. Ia menggunakan ketidaksahihan berkelompok tetapi tidak menyokong cache pertanyaan Hibernate.
Cache JBoss
Cache berkelompok yang direplikasi transaksi sepenuhnya, juga berdasarkan perpustakaan berbilang siaran JGroups. Ia menyokong replikasi atau pembatalan, komunikasi segerak atau tak segerak, dan penguncian optimistik dan pesimis. Cache pertanyaan hibernate disokong.
Enjin ini tidak menyokong semua strategi akses selari. Keadaan sebenar diterangkan dalam jadual di bawah:
Strategi/Pembekal | Baca sahaja | baca-tulis tidak ketat | baca tulis | transaksional |
---|---|---|---|---|
EHCache | X | X | X | |
OSCache | X | X | X | |
SwarmCache | X | X | ||
Cache JBoss | X | X |
Contoh konfigurasi EHCache
Enjin EHCache mempunyai fail konfigurasi sendiri yang dipanggil ehcache.xml. Anggaran kandungan fail sedemikian:
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory = "1000"
eternal = "false"
timeToIdleSeconds = "120"
timeToLiveSeconds = "120"
overflowToDisk = "true"
/>
<cache name = "Employee"
maxElementsInMemory = "500"
eternal = "true"
timeToIdleSeconds = "0"
timeToLiveSeconds = "0"
overflowToDisk = "false"
/>
Di sini anda boleh mengkonfigurasi tetapan caching secara umum dan untuk setiap entiti secara berasingan. Baca lebih lanjut dalam dokumentasi rasmi .
Analisis statistik caching
Anda juga mungkin perlu menyemak seberapa baik mekanisme caching dikonfigurasikan. Hibernate menyediakan objek Statistik khas khusus untuk ini.
Contoh:
Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);
long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);
Kami tidak akan menerangkan secara terperinci tentang perkara ini, kerana ia akan mengambil masa beberapa tahun lagi sebelum anda kehabisan penyelesaian caching standard dan perlu memperbaikinya secara manual. Dengan cara ini, ulasan ini mungkin telah diekstrak daripada kes yang serupa:
// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42