SQL Server は、次のような分散キャッシュによるイベント通知メカニズムを提供します。 NCache を通じて変更通知のために自分自身を登録することができます SqlCacheDependency 次に、データベース内の基になるデータが変更されたときにSQLServerから通知を受け取ります。 これにより、 NCache 対応するキャッシュされたアイテムをすぐに無効化または再ロードします。これにより、キャッシュは常にデータベースと同期されます。 でも、 SqlCacheDependency キャッシュをデータベースと同期するには、非常にリソースを大量に消費する方法になる可能性があります。
より良い代替案には、CLR ストアド プロシージャを作成して、 NCache SQL Server 内からアクセスし、対応するキャッシュされた項目を直接更新または無効にします。 関連するデータ構造を作成しないため、リソース効率が高くなります。 SqlCacheDependency。 また、.NETイベントを発生させません NCache。 代わりに、 NCache クライアント接続と直接伝える NCache キャッシュされたアイテムを無効にするか再ロードするか。 そして、このつながりは、 NCache は高度に最適化されており、.NET イベントよりもはるかに高速かつ軽量です。
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:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication
Foundation\SMdiagnostics.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Management] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.management.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.ServiceModel] AUTHORIZATION dbo FROM N'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\System.ServiceModel.dll' WITH permission_set = unsafe
CREATE ASSEMBLY NCache from N'C:\Program Files\NCache\bin\assembly\2.0\Alachisoft.NCache.Web.dll' WITH permission_set = unsafe
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 ...");
}
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
CLRベースのストアドプロシージャまたはトリガーは、アプリケーションのパフォーマンスを大幅に向上させることができます。 SqlCacheDependency これは比較的遅く、大規模なデータセットでは圧倒される可能性があります。