No .NET 1.1, o Cache só pode criar dependências de Cache com base em sistemas de arquivos, objetos, etc., mas o .NET 2.0 fornece uma nova dependência, SqlCacheDependency, que permite que nosso Cache dependa de alterações no banco de dados. Embora essa abordagem pareça semelhante à solução alternativa em 1.1, há uma diferença essencial entre elas (o fornecimento do objeto SqlCacheDependency). (A solução alternativa para 1.1 é criar um gatilho para a tabela de dados e, em seguida, o gatilho modificará um arquivo local quando acionado. A dependência de um determinado cache no sistema é este arquivo local, para notificar o cache do cache dados alterados)
O SqlCacheDependency do .NET 2.0 pode ser usado em versões posteriores ao SqlServer2000. Este artigo apresenta como usá-lo no Sql Server 2000. O Sql Server 2005 é um pouco diferente.
Primeiro, você precisa instalar o framework .NET 2.0. Obviamente, o Sql Server 2000 deve estar disponível. No .NET 2.0, a Microsoft fornece uma ferramenta utilitária: aspnet_regsql (no mesmo diretório que aspnet_regiis). Esta é uma ferramenta de linha de comando. Os parâmetros de linha de comando podem ser obtidos por meio de aspnet_regsql -?. Aqui nos preocupamos com os seguintes parâmetros: -ed inicia o banco de dados para dependências de cache SQL, -E usa as credenciais atuais do Windows para autenticação, -d é usado para o nome do banco de dados do servidor de aplicativos, se nenhum nome de banco de dados for especificado, o padrão banco de dados é usado "aspnetdb". Os exemplos de publicações de banco de dados da Microsoft serão usados neste artigo. Então precisamos usar a seguinte linha de comando para criar o banco de dados dependente de cache:
aspnet_regsql -ed -E -d pubs
(Observação: os parâmetros da linha de comando aqui diferenciam maiúsculas de minúsculas)
Depois de executar este comando, podemos abrir o banco de dados pubs para ver quais alterações ocorreram. Primeiro, há uma tabela adicional: AspNet_SqlCacheTablesForChangeNotification. nome da tabela, notificaçãoCreated: hora de criação. changeId: número da alteração (campo cumulativo). Você também pode ver que o banco de dados possui mais vários procedimentos armazenados, são eles:
AspNet_SqlCacheRegisterTableStoredProcedure,
AspNet_SqlCacheUnRegisterTableStoredProcedure,
AspNet_SqlCacheUpdateChangeIdStoredProcedure,
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure,
AspNet_SqlCachePollingStoredProcedure
Esses procedimentos armazenados são fáceis de entender literalmente. Os detalhes do procedimento armazenado podem ser visualizados após abri-lo no analisador de consultas. Para monitorar as alterações em uma tabela, precisamos especificar uma tabela que precisa ser monitorada executando o procedimento armazenado AspNet_SqlCacheRegisterTableStoredProcedure. Claro, ela também pode ser especificada por meio da ferramenta utilitária aspnet_regsql.
aspnet_regsql -et -E -d pubs -t autores
Após executar o comando acima, aspnet_regsql criará um gatilho para autores. A seguir está o gatilho que criei após executar o comando:
DEFINIR QUOTED_IDENTIFIER ATIVADO
IR
DEFINIR ANSI_NULLS ATIVADO
IR
ALTER TRIGGER dbo.[autores_AspNet_SqlCacheNotification_Trigger] ON [autores]
PARA INSERIR, ATUALIZAR, EXCLUIR COMO COMEÇAR
DEFINIR NOCOUNT ON
EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'autores'
FIM
IR
DESATIVAR QUOTED_IDENTIFIER
IR
DEFINIR ANSI_NULLS ATIVADO
IR
Como pode ser visto no gatilho, o procedimento armazenado AspNet_SqlCacheUpdateChangeIdStoredProcedure será executado quando a tabela de autores for inserida, excluída e atualizada. Este procedimento armazenado adicionará um registro à tabela AspNet_SqlCacheTablesForChangeNotification. O registro é o seguinte:
notificação tableNameCreated changeId
autores 20/06/2006 09:38:26.267 1
Quando você fizer qualquer modificação nos dados dos autores, o changeId será acumulado e os outros campos não serão alterados.
Então você precisa adicionar algum conteúdo no web.config e poderá usá-lo.
Primeiro adicione a string de conexão do banco de dados:
<connectionStrings>
<add name="pubsConString" connectionString="server=localhost;database=pubs;uid=sa;pwd=mypassword;"/>
</connectionStrings>
Em segundo lugar, adicione a seção de cache:
<sistema.web>
<armazenamento em cache>
<sqlCacheDependency habilitado = "true">
<bancos de dados>
<add name="pubs" connectionStringName="pubsConString" pollTime="900"/>
</bancos de dados>
</sqlCacheDependency>
</caching>
</system.web>
A seguir está o código de teste. Quando a página é carregada, o seguinte código é executado:
protected void Page_Load(object sender, EventArgs e) {
if (HttpContext.Current.Cache["xxx"] == nulo) {
SqlCacheDependency d = new SqlCacheDependency("pubs","authors");//pubs são os pubs especificados na seção de bancos de dados, seguidos pelo nome da tabela
HttpContext.Current.Cache.Insert("xxx", "xxx", d);
Response.Write("Criar novo valor de cache é xxx.");
}
outro{
Response.Write("Carregar dados do cache, o valor é "+HttpContext.Current.Cache["xxx"].ToString());
}
}
Quando aberta pela primeira vez, esta página exibirá:
Criar novo valor de cache é xxx.
Depois de atualizar a página, ele exibe:
Carregar dados do cache, o valor é xxx
Ao usar o analisador de consulta para modificar os dados nos autores e atualizar a página novamente, ele exibirá:
O valor de criação do novo cache é xxx.
Isso mostra que o Cache está funcionando normalmente. Quando a tabela de autores for alterada, o conteúdo do Cache se tornará automaticamente inválido e meu aplicativo também recriará um objeto Cache.
Nota: SqlCacheDependency consiste em dois construtores, SqlServer2000 oferece suporte apenas a dois parâmetros e um parâmetro oferece suporte a SqlServer2005.