NHibernate è una soluzione ORM (Object Relational Mapping) popolare per .NET. Inoltre, viene spesso utilizzato in ambienti ad alto numero di transazioni in cui le applicazioni devono affrontare colli di bottiglia in termini di prestazioni e scalabilità a causa del database e dell'archiviazione dei dati.
Per gestire ciò, NHibernate fornisce due tipi di memorizzazione nella cache, Cache di primo livello (Cache di 1° livello) e Cache di secondo livello (Cache di 2° livello). La cache di primo livello è integrata e legata all'"oggetto sessione" dell'utente, mentre la cache di secondo livello fornisce un'architettura collegabile ed è legata al livello "fattore sessione" (ovvero a livello di applicazione). Ciò significa che la cache non è influenzata dalle sessioni utente che vanno e vengono. Puoi collegare una cache di terze parti come cache di secondo livello di NHibernate.
NCache è una cache distribuita estremamente veloce e scalabile linearmente per applicazioni .NET. NCache consente di aggiungere più server cache per gestire maggiori carichi di transazioni. Puoi collegarti NCache come cache di secondo livello di NHibernate.
Come parte dell'architettura del provider della cache di secondo livello di NHibernate, NCache ha implementato ICacheProvider
ed ICacheinterfaces
. Di conseguenza, puoi configurare NCache come cache di secondo livello di Hibernate senza alcuna programmazione e semplicemente modificando il file di configurazione.
Modifica semplicemente il tuo app.config
e specificare NCache come provider di cache di secondo livello e aggiungi una proprietà per esso. Abilita anche la memorizzazione nella cache di secondo livello e altre sottocache di NHibernate in app.config. Ecco un esempio di app.config
modifiche:
<hibernate-configurationxmlns="urn:nhibernate-configuration-2.2">
...
<session-factory>
...
<property name="cache.provider_class">
Alachisoft.NCache.Integrations.NHibernate.Cache.NCacheProvider,
Alachisoft.NCache.Integrations.NHibernate.Cache
</property>
<property name="cache.use_second_level_cache">
true
</property>
...
</session-factory>
</hibernate-configuration>
<appSettings>
<add key="ncache.application_id"
value="myapp" />
</appSettings>
NCache consente a ciascuna regione di Hibernate di essere configurata in modo diverso con le proprie proprietà per la memorizzazione nella cache degli oggetti. Per questo scopo NCache ha un file di configurazione chiamato NCacheNHibernate.xml
, che contiene tutte le configurazioni della regione utilizzate dalla cache di secondo livello di NHibernate. Di seguito è riportato un esempio di quel file di configurazione:
<configuration>
<application-config application-id="myapp"
enable-cache-exception="true"
default-region-name="default"
key-case-sensitivity="false">
<cache-regions>
<region name="default"
cache-name="mycache"
priority="default"
expiration-type="none"
expiration-period="0" />
<region name="AbsoluteExpirationRegion"
cache-name="myRegioncache"
priority="Default"
expiration-type="sliding"
expiration-period="180" />
</cache-regions>
...
</application-config>
</configuration>
NCache è una potente cache distribuita per .NET e fornisce molte funzionalità avanzate. Una di queste funzionalità è la sincronizzazione del database in cui la cache tiene traccia delle modifiche del database e invalida un elemento memorizzato nella cache o lo ricarica se i dati corrispondenti cambiano nel database.
È possibile configurare il provider di cache di secondo livello NHibernate per NCache per utilizzare la sincronizzazione del database. Basta modificare NCacheNHibernate.xml
file di configurazione come segue:
<configuration>
<application-config application-id="myapp"
enable-cache-exception="true"
default-region-name="default"
key-case-sensitivity="false">
...
<database-dependencies>
<dependency entity-name="nhibernator.BLL.Customer"
type="sql"
sql-statement="SELECT ContactName FROM dbo.Customers
WHERE CustomerID =?"
cache-key-format="depdency.customer:[pk]"/>
</database-dependencies>
</application-config>
</configuration>
NHibernate fornisce una funzionalità di memorizzazione nella cache delle query in cui memorizza nella cache i risultati delle query nella cache di secondo livello. Puoi abilitare la cache delle query di Hibernate in app.config
file di configurazione come segue:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
...
<session-factory>
...
<property name="cache.use_query_cache">
true
</property>
...
</session-factory>
</hibernate-configuration>
La query insieme alle chiavi primarie dei set di risultati viene archiviata in un'area di query predefinita denominata NHibernate.Cache.StandardQueryCache
. Tuttavia, gli oggetti recuperati come risultato della query vengono memorizzati nella cache nelle rispettive regioni. Inoltre, l'abilitazione della cache delle query non memorizza nella cache ogni query per impostazione predefinita. È invece necessario impostare ciascuna query come memorizzabile nella cache nel codice come segue:
IQuery qry = session.CreateQuery("from Customer c").SetCacheable(true);
Se la tua applicazione Hibernate è in esecuzione in un ambiente multi-server, allora hai bisogno di una cache distribuita come NCache come provider di cache di secondo livello di NHibernate per i seguenti motivi: