Pagse-set up ng caching

Bumalik tayo sa aming mga setting ng caching sa hibernate.cfg.xml file:

<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"/>

Bigyang-pansin ang unang linya - naglalaman ito ng pangalan ng klase ng caching engine. Ang hibernate ay hindi aktwal na nagpapatupad ng caching sa loob, sa halip ay nagbibigay ito ng isang hanay ng mga interface kung saan maaari mong ipatupad ang iyong sariling caching engine.

Kabilang sa mga sikat na pagpapatupad ang:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Maaari itong i-cache sa memorya o sa disk, pati na rin sa cluster caching, at sinusuportahan din ang isang opsyonal na cache ng mga resulta ng Hibernate query.

OSCache

Sinusuportahan ang memory at disk caching sa parehong JVM na may isang rich set ng mga patakaran sa pag-expire at query cache support.

SwarmCache

Cluster cache batay sa JGroups. Gumagamit ito ng clustered invalidation ngunit hindi sinusuportahan ang Hibernate query cache.

JBoss Cache

Isang ganap na transactional na kinopya na clustered cache, batay din sa JGroups multicast library. Sinusuportahan nito ang pagtitiklop o kawalan ng bisa, kasabay o asynchronous na komunikasyon, at optimistic at pessimistic na pag-lock. Ang hibernate query cache ay suportado.

Hindi sinusuportahan ng mga makinang ito ang lahat ng parallel na diskarte sa pag-access. Ang aktwal na sitwasyon ay inilarawan sa talahanayan sa ibaba:

Diskarte/Provider Basahin lamang hindi mahigpit na read-write basa sulat transactional
EHCache X X X
OSCache X X X
SwarmCache X X
JBoss Cache X X

Halimbawa ng pagsasaayos ng EHCache

Ang EHCache engine ay may sariling configuration file na tinatawag na ehcache.xml. Ang tinatayang nilalaman ng naturang file:

<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"
/>

Dito maaari mong i-configure ang mga setting ng caching sa pangkalahatan at para sa bawat entity nang hiwalay. Magbasa nang higit pa sa opisyal na dokumentasyon .

Pagsusuri ng mga istatistika ng caching

Maaaring kailanganin mo ring suriin kung gaano kahusay na-configure ang mekanismo ng pag-cache. Ang hibernate ay nagbibigay ng isang espesyal na object ng Statistics na partikular para dito.

Halimbawa:

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

Hindi na kami magdedetalye tungkol dito, dahil marami pang taon bago ka maubusan ng mga karaniwang solusyon sa pag-cache at kailangan mong pahusayin ang mga ito nang manu-mano. Sa pamamagitan ng paraan, ang komentong ito ay maaaring kinuha mula sa isang katulad na kaso:

// 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