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