domenica 10 ottobre 2010

Hibernate e la cache di secondo livello

Hibernate ha la possibilità di configurare una cluster cache. Questo sia per le singole classi che per le collection di dati (class-by-class basis or collection-by-collection basis). E' anche possibile configurare una cache clutered. E' evidente che questo meccanismo da alcuni vantaggi, ma anche alcuni svantaggi.


Vantaggi

  • Il database non sarà gravato da continue richieste, perchè molte di queste verranno già risolte a livello di cache.
  • Il workload per rappresentare un dato tabulare come oggetto si riduce.
  • La cache, che di solito è in memoria, è molto più veloce nel reperire i dati che non l'accesso al database.
  • La cache può essere clusterizzata, aumentando la scalabilità ed affidabilità del sistema.

Svantaggi
  • I dati, se possono essere variati anche da altre applicazioni, potrebbero non essere sempre aggiornati: è quindi necessario configurare adeguate policies di refresh dei dati.
Per questo tipo si caching, dette cache di secondo livello, Hibernate si affida a librerie esterne, che possono essere pluggate.
Per fare questo è sufficiente fare 2 operazioni.
  1. Nella configurazione di hibernate (hibernate.hbm.xml) basta settare la proprietà hibernate.cache.provider_class
  2. Per ogni classe di cui si vuole fare caching si deve aggiungere il tag al file di mapping (o l'equivalente annotation sulla classe, ma io preferisco lavorare con i files di mapping) oppure, a livello di configurazione hibernate (hibernate.hbm.xml) specificare gli elementi e
Hibernate supporta alcuni cache providers, da una semplice Hashtable, creata per ragioni di test (e assolutamente da NON usare in produzione) a EHCache che supporta la replicazione e il clustering, a a JBossCache 2 che supporta anche la Query Cache.
Da mettere in evidenza che Hibernate, fino alla versione 3.0, veniva impacchettato con EHCache di default, e su questa Cache enterò più in dettaglio in futuro.