Sincronize o cache distribuído com o banco de dados por meio de sondagem

Introdução

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.

Usando DbDependency no código

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.

Configurando o banco de dados

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.

  1. Crie uma tabela 'ncache_db_sync' em seu banco de dados Oracle e adicione quatro campos: (1) cache_key VARCHAR2, (2) cache_id VARCHAR2, (3) NUMBER modificado e (4) work_in_progress NUMBER.
  2. 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
        );
  3. Crie gatilhos UPDATE e DELETE para cada tabela em que a notificação é necessária. Os gatilhos serão usados ​​para definir o campo 'modificado' da linha correspondente no ncache_db_sync tabela para 1.
  4. /*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:

  1. Esta é uma dependência baseada em linha. A chave de cache está associada ao valor da chave primária da tabela. Isso significa que um item expira apenas se a linha com essa chave primária for alterada.
  2. O valor cache_key deve ser o mesmo que foi usado para adicionar o registro correspondente no cache.

O que fazer a seguir?

© Copyright Alachisoft 2002 - . Todos os direitos reservados. NCache é uma marca registrada da Diyatech Corp.