Menyiapkan cache

Mari kembali ke pengaturan caching kita di 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"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

Perhatikan baris pertama - berisi nama kelas mesin caching. Hibernate sebenarnya tidak mengimplementasikan caching secara internal, melainkan menyediakan satu set antarmuka yang dapat digunakan untuk mengimplementasikan mesin caching Anda sendiri.

Implementasi populer meliputi:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Itu dapat di-cache di memori atau di disk, serta di caching kluster, dan juga mendukung cache opsional dari hasil kueri Hibernasi.

OSCache

Mendukung cache memori dan disk di JVM yang sama dengan serangkaian kebijakan kedaluwarsa dan dukungan cache kueri.

SwarmCache

Cache cluster berdasarkan JGroups. Ini menggunakan pembatalan berkerumun tetapi tidak mendukung cache kueri Hibernasi.

Cache JBoss

Cache berkerumun yang direplikasi sepenuhnya transaksional, juga berdasarkan perpustakaan multicast JGroups. Ini mendukung replikasi atau pembatalan, komunikasi sinkron atau asinkron, dan penguncian optimis dan pesimis. Cache kueri hibernasi didukung.

Mesin ini tidak mendukung semua strategi akses paralel. Situasi sebenarnya dijelaskan dalam tabel di bawah ini:

Strategi/Penyedia Hanya baca baca-tulis non-ketat Baca tulis transaksional
EHCache X X X
OSCache X X X
SwarmCache X X
Cache JBoss X X

Contoh konfigurasi EHCache

Mesin EHCache memiliki file konfigurasinya sendiri yang disebut ehcache.xml. Perkiraan konten dari file tersebut:

<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 dapat mengonfigurasi pengaturan caching baik secara umum maupun untuk setiap entitas secara terpisah. Baca lebih lanjut di dokumentasi resmi .

Analisis statistik caching

Anda mungkin juga perlu memeriksa seberapa baik mekanisme caching dikonfigurasi. Hibernate menyediakan objek Statistik khusus 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 merinci tentang ini, karena akan bertahun-tahun lagi sebelum Anda kehabisan solusi caching standar dan perlu memperbaikinya secara manual. Omong-omong, komentar ini mungkin diambil dari kasus 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