Ogni volta che si parla di fornire facilità di accesso e manipolazione degli oggetti, l'argomento di Mapper relazionali di oggetti (ORMs) è destinato a venire fuori. ORM come Entity Framework Core e NHibernate aiutano a gestire una mappatura efficiente di Vecchio oggetto CLR normale (POCO) istanze alle informazioni del database, gestione di associazioni, vincoli, ecc.
Tuttavia, l'utilizzo della funzionalità da codice a SQL può causare un ritardo delle prestazioni e persino un degrado, la causa più comune è il problema N+1. Le persone di StackExchange non erano contente delle prestazioni degli ORM per le loro esigenze infrastrutturali e hanno inventato azzimato, un wrapper leggero di micro-ORM attorno ad ADO.NET che è estremamente veloce e rende il mapping degli oggetti ai modelli di database molto semplice e intuitivo.
NCache Dettagli Mappatura relazionale di oggetti azzimato
Dapper Integrazione con NCache
Dapper è principalmente un insieme di metodi di estensione su Connessione IDb class e fornisce una facciata sulle operazioni ADO.NET spesso complicate. Questa è una delle ragioni principali della sua natura leggera e dell'alta velocità. Tuttavia, dove vuoi assicurarti che i dati rimangano in memoria per evitare viaggi di andata e ritorno al database, usa NCache. Con una cache distribuita come NCache, puoi ottimizzare ulteriormente le prestazioni utilizzando i provider di origini dati come mostrato nella figura seguente:
NCache Dettagli Fornitori di origini dati Origine dati con Dapper
Dapper di terze parti con fornitori di origini dati
I provider di origini dati sono la soluzione migliore ogni volta che è necessario accedere all'origine dati master back-end per scopi di lettura e scrittura. Questi provider scaricano le operazioni Dapper sul lato server.
Vediamo come la mia applicazione soddisfa le librerie Dapper con i provider di origini dati.
Implementare questo semplice Leggi tutto provider con librerie Dapper per leggere i dati direttamente dall'origine dati utilizzando NCache e la memorizzazione nella cache dei risultati migliora le prestazioni dell'applicazione.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public ProviderCacheItem LoadFromSource(string key) { var customerId = key.Replace("Customer:CustomerID:", "").Trim(); var commandDefinition = new CommandDefinition($@" SELECT * FROM dbo.Customers WHERE CustomerID = @cId", new { cid = customerId }, flags: CommandFlags.NoCache); var customer = Connection.Query<Customer>(commandDefinition).FirstOrDefault(); var providerCacheItem = new ProviderCacheItem(customer) { Dependency = GetCustomerSqlDependency(customerId), ResyncOptions = new ResyncOptions(true) }; return providerCacheItem; } |
NCache Dettagli Fornitori di origini dati Origine dati con Dapper
Allo stesso modo, per scrivere i dati direttamente nel datastore, NCache fornisce un Scrivere attraverso provider che prende i dati da te e li scrive nel datastore mantenendo una copia nella cache.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public OperationResult WriteToDataSource(WriteOperation operation) { Customer customer = null; if (operation.OperationType == WriteOperationType.Add || operation.OperationType == WriteOperationType.Update) { customer = operation.ProviderItem.GetValue<Customer>(); } if (operation.OperationType == WriteOperationType.Add) { var commandDefinition = new CommandDefinition(// INSERT sql command for customer data with customer id , customer, flags: CommandFlags.NoCache); Connection.Execute(commandDefinition); } else if (operation.OperationType == WriteOperationType.Update) { var commandDefinition = new CommandDefinition(// UPDATE sql command for customer data with customer id, customer, flags: CommandFlags.NoCache); Connection.Execute(commandDefinition); } else if (operation.OperationType == WriteOperationType.Delete) { var customerId = operation.Key.Replace("Customer:CustomerID:", "").Trim(); var commandDefinition = new CommandDefinition(// delete sql script for given customer id , new { cId = customerId }, flags: CommandFlags.NoCache); Connection.Execute(commandDefinition); } } |
NCache Dettagli Fornitori di origini dati Origine dati con Dapper
Puoi trovare questa soluzione dettagliata dove NCache utilizza le librerie Dapper per popolare e leggere un datastore GitHub.
Elencherò i vantaggi che ho notato con il NCache-Collaborazione elegante.
Vantaggio n. 1: provider di origini dati per la sincronizzazione
Per evitare di mantenere i dati non aggiornati nella cache, Datasource Providers insieme a funzionalità di dipendenza dal database garantire la sincronizzazione dei dati memorizzati nella cache e dei dati nel database. Tutte le operazioni per risincronizzare la cache vengono eseguite sul lato server senza alcun coinvolgimento del client.
Vantaggio n. 2: fornitori di origini dati per risparmiare l'applicazione client
Supponiamo che tu voglia apportare modifiche al tuo datastore: eventuali aggiornamenti dello schema, variazioni di tabella, anche se modifichi del tutto l'intero datastore, ecco come NCache semplifica il processo per te. Insieme a NCache Provider di origini dati non è necessario modificare l'applicazione client, sarebbe sufficiente aggiornare l'implementazione dell'origine dati.
Vantaggio n. 3: scalabile NCache per memorizzare i risultati della query
Se la tua applicazione viene eseguita in un ambiente in cui più istanze dell'applicazione sono in esecuzione dietro un sistema di bilanciamento del carico (ad es. server farm, cluster Kubernetes) che condividono la cache, allora questo è ciò che NCache fa: se una delle istanze interroga l'origine dati, il risultato viene archiviato nella cache distribuita, quindi quando altre istanze richiedono lo stesso risultato, lo ottengono direttamente dalla cache senza dover effettuare un roundtrip all'origine dati.
Ciò riduce gli accessi al tuo database e, essendo scalabile, NCache può soddisfare un aumento del carico delle richieste semplicemente ridimensionando il cluster in tempo reale senza dover ridurre il cluster.
NCache Dettagli Fornitori di origini dati Origine dati con Dapper
Riassumendo
Laddove gli ORM ti forniscono facilità, possono anche essere pesanti per la tua applicazione e causare un degrado imprevisto delle prestazioni. Dapper, tuttavia, è estremamente leggero e offre un maggiore controllo allo sviluppatore che ha bisogno di avere in mente questa conoscenza durante l'architettura di query e comandi efficienti.
Ora che hai qualcosa di così esperto, perché non provi a usare una cache distribuita come NCache con esso? NCache, con le sue funzionalità in memoria e di facile scalabilità, integra le librerie Dapper con una precisione tale che i risultati sono semplicemente sbalorditivi. Quindi, vai a prendere NCache adesso!