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
GO TO FULL VERSION