NHibernate cache di secondo livello
NHibernate è un popolare framework Object-Relational Mapping (ORM) per Applicazioni .NET, che consente interazioni fluide con il database tramite codice orientato agli oggetti. Tuttavia, quando le applicazioni gestiscono un volume elevato di carichi di transazioni, spesso subiscono colli di bottiglia nelle prestazioni a causa di frequenti query del database.
Per risolvere questo problema, NHibernate fornisce la memorizzazione nella cache di secondo livello, che mantiene gli oggetti in memoria a livello di applicazione, riducendo la necessità di accedere ripetutamente al database. NCache, una cache distribuita estremamente veloce e scalabile, agisce come un Cache di secondo livello NHibernate provider, che migliora significativamente la velocità, la scalabilità e l'affidabilità delle applicazioni.
NCache Fornisce una cache di secondo livello (L2) distribuita ad alte prestazioni per NHibernate che elimina i colli di bottiglia del database nelle applicazioni .NET. Offre scalabilità lineare, uptime del 100% tramite clustering peer-to-peer e non richiede alcuna modifica al codice per l'integrazione.
Che aspetto ha e come funziona il NCache migliorare le prestazioni delle applicazioni NHibernate?
NCache potenzia NHibernate con query più veloci, carico del database ridotto ed elevata disponibilità, come spiegato di seguito.
- Performance: L'archiviazione in memoria dei dati a cui si accede frequentemente riduce i tempi di accesso al database fino al 90%, garantendo un'esecuzione più rapida delle query e una migliore reattività. Questo elimina i "punti critici del database", ovvero i punti in cui il database non riesce a gestire il volume di richieste di lettura ripetute da più server web, consentendo al livello applicativo di scalare linearmente mantenendo al minimo il carico del database. I benchmark interni mostrano NCache può gestire oltre 2 milioni di operazioni al secondo con una latenza inferiore al millisecondo.
- Cache cliente: Consente alle applicazioni di accedere al sottoinsieme di dati memorizzati nella cache utilizzato più frequentemente dalla propria memoria, riducendo le chiamate di rete e migliorando ulteriormente le prestazioni.
- Serializzazione compatta: NCache assicura una serializzazione e una deserializzazione efficienti con Serializzazione compatta, rendendo il recupero dei dati notevolmente più rapido rispetto alla serializzazione .NET standard.
- Scalabilità lineare: NCache Consente alle applicazioni di scalare dinamicamente aggiungendo più server cache. Garantisce inoltre che il carico della cache sia distribuito uniformemente in un ambiente cluster.
- Alta disponibilità: NCacheIl clustering peer-to-peer elimina i tempi di inattività, mentre il failover e la replica automatici prevengono la perdita di dati e mantengono la coerenza della cache. NCache offre una replica intelligente dei dati attraverso più topologie di memorizzazione nella cache, tra cui:
- Cache di replica partizione: Mantiene copie ridondanti dei dati memorizzati nella cache tra le partizioni per evitare la perdita di dati.
- cache specchiata: Fornisce un meccanismo di backup sincrono per il failover in tempo reale.
- Cache replicata: Garantisce la disponibilità dei dati distribuendo la stessa cache su più nodi del cluster.
- Casi d'uso comuni per NCache Cache L2 di NHibernate:
- Web farm ad alto traffico: Scalabilità delle applicazioni .NET su più server senza conflitti di database.
- Coerenza dei dati in tempo reale: Utilizzo della dipendenza SQL per sincronizzare la cache con le modifiche del database esterno.
- Modernizzazione del sistema legacy: Miglioramento delle prestazioni delle app NHibernate esistenti con un provider plug-and-play.
Confronto tecnico: NHibernate L1 vs. NCache L2
| Caratteristica |
NHibernate L1 (Cache di sessione) |
NCache (Cache L2 distribuita) |
| Ambito e isolamento |
Ambito di transazione. I dati sono isolati in un singolo Isessione oggetto. |
A livello di processo/cluster. I dati vengono condivisi tra tutte le sessioni e tutti i server della web farm. |
| Persistenza dei dati |
Effimero. Gli oggetti vengono eliminati non appena la sessione viene chiusa o la richiesta termina. |
Persistente in memoria. I dati risiedono nel cluster di cache indipendentemente dal riavvio dell'applicazione o dalla chiusura della sessione. |
| Scalabilità |
Solo in fase di elaborazione. Limitato dalla memoria di un singolo server web; non può essere condiviso in una farm. |
Scalabilità lineare. È possibile aggiungere server cache in modo dinamico per aumentare la capacità di archiviazione e la velocità effettiva. |
| Sincronizzazione del database |
Nessuno. L1 non ha alcun meccanismo per sapere se un altro processo ha aggiornato il DB. |
Sincronizzazione automatica. Usi Dipendenza dalla cache SQL, Oracle Dependency o Polling per invalidare i dati obsoleti. |
| Cache delle query |
Non applicabile (L1 è principalmente per le ricerche basate su ID). |
Supportato. Memorizza nella cache i risultati di query complesse per evitare ripetute e costose esecuzioni SQL. |
Caratteristiche principali di NCache per NHibernate
Di seguito sono riportate alcune delle caratteristiche principali che NCache offre agli utenti di NHibernate:
Nessuna modifica del codice richiesta
- Si integra facilmente con NHibernato come soluzione plug-and-play senza modificare il codice applicativo esistente.
- Tutte le configurazioni vengono gestite tramite file di configurazione basati su XML.
Più regioni memorizzabili nella cache
- Priorità elemento cache: Assegna diversi livelli di priorità (Alto, Normale, Basso) ai dati memorizzati nella cache, assicurando che gli oggetti a cui si accede di frequente rimangano nella cache più a lungo.
- Scadenza assoluta: Le voci della cache scadono a un orario fisso. Ciò garantisce che i dati obsoleti vengano eliminati automaticamente, indipendentemente dalla frequenza con cui vengono consultati.
- Scadenza scorrevole: La scadenza si azzera all'accesso, rendendolo ideale per dati dinamici ma utilizzati di frequente.
- Configurazione basata sulla regione: Personalizza il comportamento di memorizzazione nella cache per diverse regioni di dati utilizzando NCacheFile di configurazione NHibernate.xml.
<configuration>
<application-config application-id="myapp"
enable-cache-exception="true"
default-region-name="default"
key-case-sensitivity="false" >
<cache-regions>
<region name="AbsoluteExpirationRegion"
cache-name="demoCache"
priority="Default"
expiration-type="sliding"
expiration-period="180" />
<region name="default"
cache-name="demoCache"
priority="default"
expiration-type="none"
expiration-period="0"/>
</cache-regions>
</application-config>
</configuration>
Che aspetto ha e come funziona il NCache mantenere i dati NHibernate sincronizzati con il database?
- Monitora le modifiche al database per mantenere aggiornati i dati memorizzati nella cache.
- Funziona perfettamente con database basati su SQL Server, Oracle e OLEDB.
- si utilizza Invalidazione basata sulla dipendenza SQL per rimuovere o aggiornare i dati obsoleti memorizzati nella cache.
<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="dependency.customer: [us]"/>
</database-dependencies>
</application-config>
</configuration>
Cache di query NHibernate
- Memorizzazione nella cache dei risultati delle query: Memorizza nella cache i risultati delle query per ridurre le esecuzioni ripetute delle stesse query del database.
- Archiviazione delle query: Memorizza le query nella regione NHibernate.QueryCache per ricerche più rapide.
- Operazioni asincrone: Aggiorna la cache in modo non bloccante, assicurando che l'esecuzione dell'applicazione non venga ritardata.
- Operazioni di sincronizzazione: Aggiorna o invalida istantaneamente i dati memorizzati nella cache quando si verificano modifiche al database, mantenendo la coerenza dei dati.
Abilita la memorizzazione nella cache delle query nel codice dell'applicazione
Questo esempio mostra come abilitare la memorizzazione nella cache delle query di NHibernate con NCache per memorizzare e riutilizzare i risultati delle query per migliorare le prestazioni.
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
IQuery query = session.CreateQuery("FROM Customer c")
.SetCacheable(true);
var customers = await query.ListAsync<Customer>();
var newCustomer = new Customer { Name = "John Doe" };
await session.SaveAsync(newCustomer);
await session.FlushAsync();
transaction.Commit();
}
}
Come configurare NCache con NHibernate?
Installazione NCache Cliente per NHibernate
Installazione NCache server
Configurazione NCache per NHibernate
Modifica i file di configurazione di NHibernate per abilitare NCache come fornitore di cache di secondo livello.
Aggiorna hibernate.cfg.xml
<hibernate-configuration xmlns="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>
Cosa fare dopo?
Domande frequenti (FAQ)
NCache fornisce un'alternativa distribuita e multi-nodo alla cache primaria predefinita (L1) di NHibernate. Mentre L1 è limitata a una singola sessione, NCache consente alla tua applicazione di condividere i dati memorizzati nella cache su un'intera web farm, riducendo i viaggi del database fino al 90% e prevenendo i colli di bottiglia del database durante i picchi di traffico.
Sì. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. NCache Supporta pienamente NHibernate Query Caching, che memorizza i risultati delle query SQL più complesse nella cache distribuita. Ciò garantisce che le successive esecuzioni della stessa query con gli stessi parametri non raggiungano il database, migliorando significativamente la latenza delle applicazioni.
NCache mantiene la coerenza dei dati al 100% tramite le funzionalità di sincronizzazione del database. Utilizzando la dipendenza SQL (SqlCacheDependency) o la dipendenza Oracle, NCache invalida e rimuove automaticamente gli elementi obsoleti memorizzati nella cache ogni volta che i dati del database sottostante cambiano, garantendo che l'applicazione fornisca sempre le informazioni più aggiornate.
Non sono necessarie modifiche al codice. NCache è un fornitore di cache L2 plug-and-play. L'integrazione è gestita interamente tramite configurazione modificando il tuo ibernare.cfg.xml or app.config file per puntare al NCache fabbrica del fornitore.
Per la maggior parte degli ambienti NHibernate, si consiglia la topologia Partition-Replica, in quanto offre il miglior equilibrio tra prestazioni e alta disponibilità. Per carichi di lavoro ad alta intensità di lettura, è possibile abilitare la funzionalità Client Cache (Inproc) per fornire velocità "near-cache" memorizzando un sottoinsieme di dati direttamente nella memoria dell'applicazione.