O armazenamento em cache de dados usados com frequência de seu aplicativo é uma jogada extremamente competente. Mas garantir que os dados armazenados em cache permaneçam sincronizados com o banco de dados Oracle é o dilema. O truque para superar isso é usar expirações de dados em que você adivinha o TTL (Time To Live) do item e depois o armazena em cache.
Não importa quão popular seja esse esquema, isso continua sendo um mero palpite sobre quanto tempo esse item permanecerá inalterado no banco de dados. E as suposições nem sempre são precisas. Se seu aplicativo for sensível a dados, onde a busca e o processamento de dados imprecisos refutam sua finalidade, o uso da expiração custará muito.
O que o salva dessa situação é usar um mecanismo de sincronização de banco de dados em seu cache, como NCache, que remove automaticamente os dados de cache correspondentes se for atualizado no banco de dados Oracle.
NCache Adicionar ao carrinho Dependência de cache no banco de dados Técnicas de expiração de dados
utilização NCache para sincronizar com o Oracle Server
O Oracle Dependency usa notificações de eventos que notificam todos os clientes de banco de dados quando um conjunto de dados é alterado no banco de dados. Informações de back-end: NCache usa esse recurso para se registrar como cliente do Oracle Server. Isso significa que sempre que os dados forem alterados no conjunto de dados Oracle, NCache é notificado automaticamente. Usando essas informações, NCache mantém um mapa de todos os itens em cache com seus conjuntos de dados correspondentes. Assim, sempre que NCache é notificado de uma alteração, invalida o item de cache correspondente do cache e busca o atualizado na próxima vez que o aplicativo cliente solicitar.
Vamos sincronizar NCache com servidor Oracle
Vou dar um exemplo simples de um aplicativo de comércio eletrônico (.NET Core baseado) cujo sucesso total reside na sua precisão. Milhares de clientes acessam este aplicativo para compras online a cada minuto, então os dados deste aplicativo foram armazenados em cache.
Agora, vamos pegar um cenário muito comum onde Cliente A comprou o último Xbox Series X que a loja tinha. O servidor de aplicativos remove a quantidade desse item do banco de dados, mas o cache ainda não tem conhecimento dessa alteração. Essa inconsistência leva à raiva do cliente quando Cliente B gosta do mesmo produto, paga por ele e é notificado com uma mensagem de pagamento bem-sucedida, mas não recebe seu Xbox Series X mais recente.
Aqui, para garantir que o aplicativo não enfrente problemas de integridade de dados toda vez que os dados forem alterados no banco de dados Oracle principal, NCache fornece suporte de Dependência Oracle.
Para usar esse recurso de dependência, NCache permite parametrizar sua consulta Oracle com OracleCacheDependência método que recebe valores de parâmetro em tempo de execução. Isso reduzirá o número de vezes que sua consulta precisa ser compilada no Oracle Server, melhorando o desempenho do aplicativo em dez vezes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
string connectionString = ConfigurationManager.AppSettings["connectionstring"]; string query = "SELECT ROWID, ProductID, ProductName, UnitPrice FROM Products WHERE ProductID = :productID"; var param = new OracleCmdParams(); param.Type = (OracleCmdParamsType.VarChar); param.Value = "XBoxX"; param.Direction = OracleParameterDirection.Input; // Adding the populated parameter to a dictionary Dictionary<string, OracleCmdParams> oracleParam = new Dictionary<string, OracleCmdParams>(); oracleParam.Add("productID", param); // Create Oracle Dependency var oracleDependency = new OracleCacheDependency(connString, query, OracleCommandType.Text, oracleParam); Product product = FetchProductFromDB(param.Value); string key = $"Product:{product.ProductID}"; // Create a CacheItem, add Oracle dependency, and cache it var cacheItem = new CacheItem(product); cacheItem.Dependency = oracleDependency; cache.Insert(key, cacheItem); |
NCache Adicionar ao carrinho Dependência de cache no Oracle Configurar ambiente Oracle
Há muito mais que você pode fazer com OracleCacheDependency. Aqui está uma lista de alguns recursos muito úteis suportados com esta dependência do Oracle.
Recarregar automaticamente o item de cache por meio do provedor Read-Thru
O OracleCacheDependency é responsável por invalidar um item de cache assim que ele for alterado na fonte de dados. NCache fornece Provedor de fonte de apoio de leitura caso você queira que o cache não apenas invalide, mas também busque a versão mais recente do item alterado do servidor Oracle. Com Leia opção habilitada, NCache chama o Leia através provedor para buscar os dados atualizados sempre que o Oracle Server notificar o cache de uma alteração.
O código a seguir explica como você pode obter essa funcionalidade:
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add oracle dependency to it CacheItem item = new CacheItem(product); item.Dependency = oracleDependency; // Resync if enabled, will automatically resync cache with Oracle server item.ResyncOptions = new ResyncOptions(true); //Add cache item in the cache with Oracle Dependency and Resync option enabled cache.Insert(key, item); |
NCache Adicionar ao carrinho Dependência de cache no Oracle Provedor de leitura
Dependência Oracle baseada em procedimento armazenado
NCache suporta Dependência Oracle baseada em procedimento armazenado se sua preferência for manter todas as suas consultas Oracle dentro do banco de dados Oracle. Esses procedimentos armazenados são pré-compilados no servidor Oracle e executados muito mais rapidamente do que as consultas dinâmicas do Oracle.
Para criar um Stored Procedure no Oracle, veja este exemplo:
1 2 3 4 5 6 |
CREATE PROCEDURE SelectProduct (ProductID IN VarChar) AS BEGIN SELECT ProductID, Quantity, Price FROM Products WHERE ProductID = :productID; END; |
Chamar esse procedimento armazenado em seu aplicativo .NET é fácil. Use o snippet a seguir como exemplo.
1 2 3 4 5 6 7 8 9 10 |
OracleCmdParams param = new OracleCmdParams(); param.Type = (OracleCmdParamsType.VarChar); param.Value = "XBoxX"; param.Direction = OracleParameterDirection.Input; var oracleCmdParams = new Dictionary<string, OracleCmdParams>(); oracleCmdParams.Add("productID", param); // Create Oracle Dependency var oracleDependency = new OracleCacheDependency(connString, SelectProduct, OracleCommandType.StoredProcedure, oracleCmdParams); |
NCache Adicionar ao carrinho Dependência de cache no Oracle Dependência Oracle usando procedimento armazenado
Por que sincronizar NCache com o Oracle Server?
Ninguém quer que seu aplicativo, no qual trabalhou tanto, falhe apenas porque está processando dados desatualizados. Você perde negócios e enfrenta dessa maneira. Mas NCache, para sua facilidade, fornece a você o Oracle Dependency que mantém seu cache sincronizado com seu banco de dados Oracle para garantir que o cache que você está usando para beneficiar você não falhe em vez disso.
NCache Adicionar ao carrinho Baixar NCache Comparação de edições