分散キャッシングは、データベースがスケーラビリティのボトルネックにならないようにするために、トランザクションの多いアプリケーションの非常に重要な部分になっています。 ただし、分散キャッシュはアプリケーションデータのコピーを保持するため、データベースとの同期が維持されていることを常に確認する必要があります。 これがないと、分散キャッシュに古い古いデータが含まれ、データの整合性の問題が発生します。 SQL Serverは、イベント通知メカニズムを提供します。 分散キャッシュ ような NCache を通じて変更通知のために自分自身を登録することができます SqlCacheDependency 次に、データベース内の基になるデータが変更されたときにSQLServerから通知を受け取ります。 これにより、 NCache 対応するキャッシュされたアイテムをすぐに無効化または再ロードします。これにより、キャッシュは常にデータベースと同期されます。 でも、 SqlCacheDependency キャッシュをデータベースと同期するための非常にリソースを消費する方法になる可能性があります。 まず、別のを作成する必要があります SqlCacheDependency キャッシュされたアイテムごとに、これは数十万とまではいかなくても簡単に数万に達する可能性があります。 また、SQL Serverはデータ構造を使用して、各SqlCachDependencyを個別に維持し、それに関連するデータの変更を監視できるようにします。 そして、これは多くの余分なリソースを消費し、データベースサーバーを簡単に詰まらせる可能性があります。
次に、SQL Serverは、データの変更ごとに個別の.NETイベントを発生させます。 NCache これらのイベントをキャッチします。 また、これらの.NETイベントは非常に重い可能性があり、ネットワークトラフィックと全体的なパフォーマンスを簡単に圧倒する可能性があります。 NCache とあなたのアプリケーション。 より良い代替案があります。 これはあなたが書くことを含みます CLRストアドプロシージャ と接続します NCache SQL Server内から、対応するキャッシュされたアイテムを直接更新または無効にします。 次に、テーブルの更新または削除トリガーからこのCLRストアドプロシージャを呼び出すことができます。 これは、SQL Server 2005または2008、およびOracle 10g以降のいずれかで実行できますが、Windowsで実行されている場合に限ります。 CLRストアドプロシージャは、に関連するデータ構造を作成しないため、リソース効率が高くなります。 SqlCacheDependency。 また、.NETイベントを発生させません NCache。 代わりに、それは NCache クライアント接続と直接伝える NCache キャッシュされたアイテムを無効にするか、リロードするか。 そして、この関係は NCache は高度に最適化されており、.NETイベントよりもはるかに高速で軽量です。
以下は、CLRストアドプロシージャの使用方法の例です。
- コピー log4net & プロトブフネット WindowsGACから NCache/bin/assembly/2.0フォルダー(ターゲットプラットフォームが.NET 4.0の場合は4.0を選択します)。
2.登録する NCache およびSQLサーバーの次のアセンブリ。 以下に例を示します。 この例では、サンプルデータベースとしてNorthwindを使用しています。
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. Visual Studioを開いて、に対してストアドプロシージャを記述します NCache そして、以下のようにSQLCLRデータベースプロジェクトを作成します。 への参照を追加します NCache 最後のステップで作成したアセンブリ。 参照する必要のあるアセンブリは、上で強調表示されています。 SQLServerの下に「」と同じ名前で表示されます。NCache"。
4.ストアドプロシージャを記述します。 与えられたサンプルコードは次のとおりです。
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.以下のように、データベースでCLR統合を有効にします。
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. Visual Studioからストアドプロシージャを展開し、テストします。
7.ストアドプロシージャをデプロイした後、ストアドプロシージャアセンブリを(C:Program FilesNCachebinassembly2.0)フォルダー。これは、Windows GACフォルダーから直接アセンブリ参照を解決せず、ローカルでそれらを必要とするためです。
CLRベースのストアドプロシージャまたはトリガーは、アプリケーションのパフォーマンスを大幅に向上させることができます。 SqlCacheDependency これは比較的遅く、大規模なデータセットでは圧倒される可能性があります。
SQLCacheDependency それ自体は問題ありません。 アプリケーションがデータベースに変更をコミットしている場合、ベストプラクティスは、依存関係を処理するために間に分散キャッシュを追加し、その結果、データベースにコミットすることです。 XNUMXつのシナリオでのみ、代替ソリューションを探します。
XNUMXつは、他のアプリケーションがデータベースに変更を加えていて、データベースを制御できない場合、またはキャッシュを使用してDBコミットを行うようにデータベースに指示できない場合です。
XNUMX番目の理由は、各テーブルに対して多くの依存関係を設定する場合、またはDBの書き込み/更新環境が高い場合に、ポーリングの依存関係を使用できる場合です。 データベースをポーリングして、変更を検出し、キャッシュ内のアイテムを無効にします。
詳細については、次のドキュメントを参照してください。 https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
こんにちはイクバル、
この記事に従おうとしていますが、SQLスクリプトを実行すると次のエラーが発生します。
メッセージ6544、レベル16、状態1、行26
アセンブリ'microsoft.visualbasic.activities.compiler'の形式が正しくないか、純粋な.NETアセンブリではないため、アセンブリ'System.ServiceModel'のCREATEASSEMBLYが失敗しました。
SQLCLRプロシージャ内からWCFを使用することがサポートされなくなった場合、パフォーマンスの問題を回避しながら、キャッシュ同期の推奨される方法は何ですか。 SqlCacheDependency.
ありがとう、ライアン。
この投稿は更新されました。 これで、すべてのステップが機能します NCache 4.1
こんにちはSergey、
ご使用の環境でこの問題を解決する修正をダウンロードしてください。 この実装は、 NCache 4.1バージョンであり、以下の修正を適用した後にのみ互換性があります。
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
ご使用の環境に適用するには、パッチの「Readme.txt」ファイルを参照してください。
現在、この修正はキャッシュサーバーのインストール用に提供されており、.Net 2.0アセンブリのみが含まれています。ご使用の環境でこれをテストおよび検証できます。また、.NETに固有の完全なパッチを提供できます。 NCache オンデマンドでのインストール。
さらに、ストアドプロシージャを展開した後、ストアドプロシージャアセンブリを(C:Program Files)に配置する必要があることを確認する必要があります。NCachebinassembly2.0)フォルダー。これは、Windows GACフォルダーから直接アセンブリ参照を解決せず、ローカルでそれらを必要とするためです。
どうなるか教えてください
こんにちはイクバル、
段落5と同じコードで説明したように、CLRストアドプロシージャを作成しました。実行しようとすると、次の例外がスローされます。
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException:client.ncconfの読み取り中にエラーが発生しました。
のようだ NCache 設定ファイルが見つかりませんが、ファイルはインストールディレクトリC:ProgramFilesにありますNCache設定
助けてください。
感謝
セルゲイ