Sempre que falamos em facilitar o acesso e manipulação de objetos, o assunto Mapeadores relacionais de objeto (ORMs) é obrigado a surgir. ORMs como Entity Framework Core e NHibernate ajudam no gerenciamento de mapeamento eficiente de Objeto CLR antigo simples (POCO) instâncias para informações de banco de dados, gerenciamento de associações, restrições, etc.
No entanto, usar a funcionalidade code-to-SQL pode levar a atrasos de desempenho e até degradação, sendo a causa mais comum o problema N+1. O pessoal do StackExchange não ficou satisfeito com o desempenho dos ORMs para suas necessidades de infraestrutura e criou elegante, um wrapper leve micro-ORM em torno do ADO.NET que é extremamente rápido e torna o mapeamento de objetos para modelos de banco de dados muito fácil e intuitivo.
NCache Adicionar ao carrinho Mapeamento Objeto-Relacional elegante
Integração Dapper com NCache
Dapper é principalmente um conjunto de métodos de extensão no Conexão IDb classe e fornece uma fachada sobre as operações ADO.NET muitas vezes complicadas. Essa é uma das principais razões para sua natureza leve e alta velocidade. No entanto, onde você deseja garantir que os dados permaneçam na memória para evitar viagens de ida e volta ao banco de dados, use NCache. Com um cache distribuído como NCache, você pode ajustar ainda mais o desempenho usando provedores de fonte de dados, conforme mostrado na figura abaixo:
NCache Adicionar ao carrinho Provedores de fonte de dados Fonte de dados com Dapper
Dapper de terceiros com provedores de fonte de dados
Os provedores de fonte de dados são a melhor solução sempre que a fonte de dados mestre de back-end precisa ser acessada para fins de leitura e gravação. Esses provedores transferem as operações do Dapper para o lado do servidor.
Vamos ver como meu aplicativo atende bibliotecas Dapper com provedores de fonte de dados.
Implementando este simples Leia provedor com bibliotecas Dapper para ler dados diretamente da fonte de dados usando NCache e armazenar os resultados em cache melhora o desempenho do seu aplicativo.
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 Adicionar ao carrinho Provedores de fonte de dados Fonte de dados com Dapper
Da mesma forma, para gravar os dados diretamente no armazenamento de dados, NCache fornece uma Gravação provedor que pega os dados de você e os grava no armazenamento de dados enquanto mantém uma cópia em 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 Adicionar ao carrinho Provedores de fonte de dados Fonte de dados com Dapper
Você pode encontrar esta solução detalhada onde NCache usa bibliotecas Dapper para preencher e ler um armazenamento de dados em GitHub.
Vou listar os benefícios que notei com o NCache-Colaboração Dapper.
Benefício nº 1: Provedores de fonte de dados para sincronização
Para evitar manter dados obsoletos no cache, os provedores de fonte de dados, juntamente com recursos de dependência de banco de dados garantir a sincronização dos dados armazenados em cache e dados no banco de dados. Todas as operações para ressincronizar o cache são feitas no lado do servidor sem nenhum envolvimento do cliente.
Benefício nº 2: Provedores de fonte de dados para poupar o aplicativo do cliente
Digamos que você queira fazer alterações em seu armazenamento de dados: qualquer atualização de esquema, variações de tabela, mesmo que você altere todo o armazenamento de dados, veja como NCache simplifica o processo para você. Com NCache Provedores de fonte de dados você não precisa alterar seu aplicativo cliente, basta atualizar a implementação da fonte de dados.
Benefício nº 3: Escalável NCache para armazenar os resultados da consulta
Se seu aplicativo for executado em um ambiente em que várias instâncias do aplicativo estão sendo executadas por trás de um balanceador de carga (por exemplo, farms de servidores, clusters Kubernetes) que compartilham o cache, é isso que NCache faz: se uma das instâncias consultar a fonte de dados, o resultado será armazenado no cache distribuído para que, quando outras instâncias consultarem o mesmo resultado, elas o obtenham diretamente do cache sem precisar fazer uma viagem de ida e volta para a fonte de dados.
Isso reduz os acessos ao seu banco de dados e, sendo escalável, NCache pode atender a um aumento na carga de solicitações simplesmente dimensionando o cluster em tempo real sem precisar derrubar o cluster.
NCache Adicionar ao carrinho Provedores de fonte de dados Fonte de dados com Dapper
Resumindo
Onde os ORMs fornecem facilidade, eles também podem ser pesados em seu aplicativo e causar degradação inesperada do desempenho. O Dapper, no entanto, é extremamente leve e dá mais controle ao desenvolvedor que precisa ter esse conhecimento em mente ao arquitetar consultas e comandos eficientes.
Agora que você tem algo tão proficiente, por que não tenta usar um cache distribuído como NCache com isso? NCache, com suas funcionalidades in-memory e fáceis de dimensionar, complementa as bibliotecas Dapper com tanta precisão que os resultados são de cair o queixo. Então, vá buscar NCache agora!
NCache Adicionar ao carrinho NCache Baixar Comparação de edições