NCache é uma solução de armazenamento em cache distribuído que ajuda a acelerar seus aplicativos enquanto reduz viagens caras ao banco de dados. Isso, por sua vez, aumenta a escalabilidade porque um grande número de clientes é movido do banco de dados para o cache, resultando em menor carga em seu banco de dados e eliminando a necessidade de atualizar seu hardware.
Quando os dados são adicionados em um cache, você coloca uma cópia dos dados originais do banco de dados no cache. Quando um dado específico em seu banco de dados é atualizado, sua cópia no cache permanece inalterada e, portanto, torna-se obsoleta. No entanto, essa situação ocorre apenas quando há vários aplicativos atualizando os mesmos dados no banco de dados, mas nem todos estão assumindo a responsabilidade de atualizar os dados no cache.
Em tal situação, quando alguns aplicativos estão atualizando os dados no banco de dados, mas não atualizando o cache, você precisa de uma maneira de sincronizar seu cache com um banco de dados para que qualquer modificação nos dados no banco de dados também afete os dados no cache. Isso pode ser obtido ativando notificações de eventos ou pesquisando o banco de dados para procurar atualizações. No entanto, se seu aplicativo estiver usando um dos bancos de dados, como SQL Server 2000, uma versão mais antiga do Oracle ou outro banco de dados compatível com OLEDB que não oferece suporte a notificações de eventos, o único método de sincronização com ele é pelo uso de sondagem.
Ainda neste artigo, estudaremos como NCache sincroniza o cache com um banco de dados usando polling.
Aqui está um código de exemplo que você precisa implementar em seu aplicativo para sincronizar seu banco de dados com o cache por meio de pesquisa.
String conString = "Provider=OraOLEDB.Oracle;User Id=SYSTEM;" +
"Password=xe;Data Source=xe;OLEDB.NET=true;";
OleDbConnection con = new OleDbConnection(conString);
con.Open();
String sqlCmd = "SELECT ProductID, ProductName FROM dbo.Products WHERE ProductID < 12";
OleDbCommand cmd = new OleDbCommand(sqlCmd,con);
cmd.ExecuteReader();
OleDbDataReader myReader = cmd.ExecuteReader();
List<Products> lstProducts = new List<Products>();
while (myReader.Read())
{
Products cProducts = new Products();
cProducts.ProductID = myReader.GetInt32(0);
cProducts.ProductName = myReader.GetString(1);
cProducts.SupplierID = myReader.GetInt32(2);
cProducts.UnitPrice = myReader.GetDecimal(4);
CacheItem item = new CacheItem(cProducts);
DBCacheDependency dependency =
DBDependencyFactory.CreateOleDbCacheDependency(conString,"");
_cache.Insert(cProducts.ProductID + ":dbo.Products", cProducts,
dependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.Default);
lstProducts.Add(cProducts);
};
myReader.Close();
con.Close();
No código acima, uma única linha do banco de dados é carregada e convertida em um objeto. Posteriormente, CreateOleDbCacheDependency é usado para estabelecer uma conexão com o banco de dados e registrar as linhas para as quais NCache deve procurar atualizações para. Observe que, ao criar a dependência do OleDB usando CreateOleDbCacheDependency, você precisa fornecê-la com a mesma instrução SQL usada anteriormente no código para buscar a linha específica.
Uma vez que o código acima foi implementado e executado, o NCache continuará indo para o banco de dados após cada intervalo de limpeza especificado e buscará todas as linhas atualizadas e as substituirá pelas linhas expiradas correspondentes no cache.
Já vimos no código acima como NCache implementa a sincronização com o banco de dados. No entanto, o procedimento para habilitar a sincronização baseada em polling precisa de mais algumas etapas, que veremos a seguir.
Aqui está o SQL para criar a tabela:
Create table ncache_db_sync
(
cache_key varchar2(256) not null enable,
cache_id varchar2(256) not null enable,
modified number(2,1) default 0 not null enable,
work_in_progress number(2,1) default 0 not null enable,
primary key (cache_key, cache_id) enable
);
/*Here is the SQL to create the trigger:*/
Create Trigger MyTrigger
After
Update [or delete] on dbo.Products
Referencing OLD AS oldRow
For each row
Begin
Update ncache_db_sync
Set modified = 1
Where cache_key = (Cast(Select oldRow.ProductID FROM deleted OLD) As VarChar)
+ ':dbo.Products'
End Trigger;
Observação: cache_key deve ser a mesma chave usada para adicionar o registro correspondente no cache.
A forma como os gatilhos e o 'ncacheA tabela _db_sync' funciona é que sempre que um valor na tabela do banco de dados é alterado ou excluído, o gatilho apropriado é chamado automaticamente. O gatilho irá alterar o valor do campo 'modificado' do 'ncache_db_sync' para 1, indicando que o valor da chave primária foi modificado.
A NCache executa a limpeza de itens expirados e desnecessários no cache após cada período especificado. Este período é chamado de intervalo limpo. Em cada intervalo limpo, o NCache também procura o valor do campo 'modificado' no campo 'ncachetabela _db_sync'. Se o valor for '1', o NCache em seguida, remove as chaves expiradas apropriadas do cache e busca todas as linhas atualizadas do banco de dados e as coloca no cache.
Observações: