O cache distribuído tornou-se uma parte muito importante de qualquer aplicativo de alta transação para garantir que o banco de dados não se torne um gargalo de escalabilidade. Mas, como um cache distribuído mantém uma cópia dos dados do aplicativo, você deve sempre garantir que ele seja mantido sincronizado com o banco de dados. Sem isso, o cache distribuído possui dados obsoletos mais antigos que causam problemas de integridade de dados. O SQL Server fornece um mecanismo de notificação de eventos em que o cache distribuído como NCache pode se registrar para notificação de alteração através SqlCacheDependency e, em seguida, receba notificações do SQL Server quando os dados subjacentes forem alterados no banco de dados. Isso permite NCache para invalidar ou recarregar imediatamente o item em cache correspondente e isso mantém o cache sempre sincronizado com o banco de dados. No entanto, SqlCacheDependency pode se tornar uma maneira muito intensiva de recursos de sincronização do cache com o banco de dados. Em primeiro lugar, você precisa criar um arquivo separado SqlCacheDependency para cada item armazenado em cache e isso pode facilmente chegar a dezenas de milhares, senão centenas de milhares. E o SQL Server usa estruturas de dados para manter cada SqlCachDependency separadamente para que possa monitorar quaisquer alterações de dados relacionadas a ele. E isso consome muitos recursos extras e pode facilmente sufocar o servidor de banco de dados.
Em segundo lugar, o SQL Server dispara eventos .NET separados para cada alteração de dados e NCache capta esses eventos. E esses eventos .NET podem ser bastante pesados e podem facilmente sobrecarregar o tráfego de rede e o desempenho geral de NCache e sua aplicação. Existe uma alternativa melhor. Isso envolve você escrever um Procedimento armazenado CLR que se conecta com NCache de dentro do SQL Server e atualiza ou invalida diretamente o item em cache correspondente. E, em seguida, você pode chamar esse procedimento armazenado CLR de um gatilho de atualização ou exclusão de sua tabela. Você pode fazer isso com o SQL Server 2005 ou 2008 e também com o Oracle 10g ou posterior, mas somente se estiver sendo executado no Windows. Um procedimento armazenado CLR é mais eficiente em termos de recursos porque não está criando estruturas de dados relacionadas a SqlCacheDependency. E também não dispara eventos .NET para NCache. Em vez disso, abre um NCache conexão do cliente e informa diretamente NCache invalidar um item em cache ou recarregá-lo. E essa ligação com NCache é altamente otimizado e muito mais rápido e leve que eventos .NET.
Abaixo está um exemplo de como usar um procedimento armazenado CLR.
- Copiar log4net e protobuf-net do Windows GAC para NCache/bin/assembly/2.0 (escolha 4.0 se a plataforma de destino for .NET 4.0).
2. Registre-se NCache e seguindo assemblies no servidor SQL. Exemplo é dado abaixo. Neste exemplo, estamos usando o Northwind como um banco de dados de exemplo.
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 30 31 32 33 34 35 36 |
use Northwind alter database Northwind set trustworthy on; go drop assembly SMdiagnostics drop assembly [System.Web] drop assembly [System.Messaging] drop assembly [System.ServiceModel] drop assembly [System.Management] CREATE ASSEMBLY SMdiagnostics AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv3.0Windows Communication FoundationSMdiagnostics.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.Web.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Management] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.management.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv2.0.50727System.Messaging.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.ServiceModel] AUTHORIZATION dbo FROM N'C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.ServiceModel.dll' WITH permission_set = unsafe CREATE ASSEMBLY NCache FROM N'C:Program FilesNCachebinassembly2.0Alachisoft.NCache.Web.dll' WITH permission_set = unsafe |
3. Abra o Visual Studio para gravar um procedimento armazenado NCache E crie um projeto de banco de dados SQL CLR conforme mencionado abaixo. Adicione uma referência ao NCache montagem que você criou na última etapa. A montagem que você precisa consultar está destacada acima. Ele aparecerá no SQL Server com o mesmo nome que “NCache".
4. Escreva seu procedimento armazenado. Aqui está um código de exemplo fornecido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void TestSProc(string cacheName) { //--- Put your code here SqlPipe sp = SqlContext.Pipe; try { sp.Send("Starting ....."); if (string.IsNullOrEmpty(cacheName)) cacheName = "mycache"; Cache _cache = NCache.InitializeCache(cacheName); _cache.Insert("key", DateTime.Now.ToString()); sp.Send("Test is completed ..."); } |
5. Habilite a integração CLR no banco de dados conforme indicado abaixo:
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. Implante o procedimento armazenado do Visual Studio e teste-o.
7. Depois de implantar o procedimento armazenado, você precisa colocar o assembly do procedimento armazenado em (C:Arquivos de ProgramasNCachebinassembly2.0), pois não resolve referências de assembly diretamente da pasta GAC do Windows e precisa delas localmente.
Os procedimentos armazenados ou gatilhos baseados em CLR podem melhorar muito o desempenho do aplicativo em comparação com o SqlCacheDependency que é relativamente mais lento e pode ser esmagador para grandes conjuntos de dados.
SQLCacheDependency não tem problemas em si. Se você tiver seu aplicativo confirmando alterações no banco de dados, a melhor prática é adicionar um cache distribuído no meio para lidar com a dependência e, consequentemente, confirmar com o banco de dados. Apenas em dois cenários você procura soluções alternativas.
Uma é quando algum outro aplicativo está fazendo as alterações no banco de dados e você não tem nenhum controle sobre ele ou não pode direcioná-lo para usar o cache para fazer commits do banco de dados.
A segunda razão pode ser quando você deseja ter muitas dependências em cada tabela ou tem um ambiente de gravações/atualizações de banco de dados alto, então você pode usar a dependência de pesquisa. Ele sondará o banco de dados para detectar qualquer alteração e invalidar os itens no cache.
Para mais informações consulte este documento: https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
Olá Iqbal,
Estou tentando seguir este artigo, mas estou recebendo o seguinte erro ao executar o script SQL.
Msg 6544, nível 16, estado 1, linha 26
CREATE ASSEMBLY para o assembly 'System.ServiceModel' falhou porque o assembly 'microsoft.visualbasic.activities.compiler' está malformado ou não é um assembly .NET puro.
Se o uso do WCF de dentro de um procedimento SQLCLR não for mais suportado, qual é o método recomendado de sincronização de cache, evitando os problemas de desempenho com SqlCacheDependency.
Obrigado, Ryan.
Esta postagem foi atualizada. Agora todas as etapas funcionam com NCache 4.1
Oi Sergey,
Baixe a correção que resolverá esse problema em seu ambiente. Esta implementação foi fornecida em cima de NCache 4.1 e será compatível somente após a aplicação da correção abaixo.
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
Consulte o arquivo “Readme.txt” no patch para aplicá-lo em seu ambiente.
Atualmente esta correção é fornecida para instalação do Cache Server e contém somente assemblies .Net 2.0, você pode testar e verificar isso em seu ambiente, podemos fornecer a você patch completo específico para .NET e NCache instalação sob demanda.
Além disso, você precisa garantir que depois de implantar o procedimento armazenado, você precisa colocar o assembly do procedimento armazenado em (C:Arquivos de ProgramasNCachebinassembly2.0), pois não resolve referências de assembly diretamente da pasta GAC do Windows e precisa delas localmente.
Por favor, deixe-me saber como vai
Olá Iqbal,
Eu criei o proc armazenado CLR como você descreveu com o mesmo código do parágrafo 5. Quando tento executar, ele lança a seguinte exceção:
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException: Ocorreu um erro ao ler client.ncconf.
Parece que NCache não é possível encontrar o arquivo de configuração, mas o arquivo existe no diretório de instalação C:Arquivos de ProgramasNCacheconfiguração
Por favor me ajude.
obrigado
Sergey