キャッシュを SQL と同期する / NoSQL Databases

NCache は、非常に高速で直線的にスケーラブルな分散キャッシュであり、アプリケーションをキャッシュしてアプリケーションのパフォーマンスを向上させることができます。 アプリケーション データをキャッシュすると、データベースにも存在するデータのコピーがキャッシュ内に作成されます。 データベース内のこのデータが変更された場合は、キャッシュも更新されて、常にデータベースとの一貫性が保たれるようにする必要があります。

この状況に対処するには、 NCache リレーショナルまたはリレーショナルでデータが変更されたときにキャッシュが自動的に同期する、強力なデータベース同期機能を提供します。 NoSQL database。 ここでの同期とは、対応するキャッシュされたアイテムをキャッシュから削除する (または、リードスルーで再ロードする) ことを意味します。 NCache データベース同期のために次の機能が提供されます。

  1. SQL依存関係
  2. Oracleの依存関係
  3. Cosmos DB / MongoDB とキャッシュを同期する
  4. OleDB の依存関係
  5. CLR手順
  6. リードスルーによる自動リロード

次の図は、その方法の基本的なアーキテクチャを示しています。 NCache データベース同期をサポートします。

データベースの同期

SQLの依存関係

Sql依存性 によって使用されます NCache データベースが SQL Server の場合。 キャッシュ内で項目を追加または更新するときに、キャッシュされた項目に対して SqlDependency を指定できます。 SQL Server はデータセットの追加、更新、または削除を監視し、通知します。 NCache データベースの更新直後に SQL 通知を介して送信されます。 これらは、.NET イベントに変換されるデータベース通知です。

SqlDependency は次のいずれかになります。

  • パラメータ化された SQL クエリ
  • ストアドプロシージャ

このトピックの詳細については、ブログをご覧ください。 キャッシュをSQLServerと同期する.

パラメータ化されたクエリの使用

動的パラメータ化クエリを使用して .NET コードで SqlDependency を使用する方法は次のとおりです。

string connString = ConfigurationManager.AppSettings["connectionString"];
string query = "SELECT ProductID, ProductName, UnitPrice FROM Products WHERE ProductID > @productID";
...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("@productID", param);

SqlCacheDependency sqlDepenency = new SqlCacheDependency(connString, query, SqlCommandType.Text, sqlCmdParam);

ストアド プロシージャの使用

ストアド プロシージャを使用して .NET コードで SqlDependency を使用する方法は次のとおりです。

...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("productID", param);

SqlCacheDependency sqlDependency = new SqlCacheDependency(connString, "sp_GetProductByID", SqlCommandType.StoredProcedure, sqlCmdParams);

Oracleの依存関係

Oracleの依存関係 によって使用されます NCache データベースが Oracle 10g 以降で、Windows または Unix 上で実行されている場合。 SqlDependency と同様に、キャッシュ内で項目を追加または更新するときに、キャッシュされた項目に対して OracleDependency を指定できます。

OracleDependency は次のいずれかになります。

  • パラメータ化された SQL クエリ
  • ストアドプロシージャ

次に、Oracle サーバーは、このデータセットの追加、更新、または削除を監視し、追加、更新、または削除が発生すると、通知します。 NCache データベースの更新直後に Oracle 通知を介して。 これらの通知は、Oracle のクライアント/サーバー通信を使用して、以下と通信します。 NCache .NET経由で。

パラメータ化されたクエリの使用

動的パラメータ化クエリを使用して .NET コードで OracleDependency を使用する方法は次のとおりです。

...
var param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDepenency = new OracleCacheDependency(connString, query, OracleCommandType.Text, oracleParam);

ストアド プロシージャの使用

次に示すように、Oracle 依存関係でパラメータ化されたストアド プロシージャ呼び出しを使用できます。

...
OracleCmdParams param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDependency = new OracleCacheDependency(connString, "sp_GetProductByID", OracleCommandType.StoredProcedure, oracleParam);

Cosmos DB / MongoDB とキャッシュを同期する

NCache また、キャッシュ項目に対する依存関係をいつどのように呼び出すかについて、より柔軟に制御できるようになります。 拡張可能な通知の依存関係 キャッシュからデータを削除するタイミングを指定するカスタム ロジックを実装できます。 Cosmos DB や MongoDB などの基になるデータベース用のカスタム プロバイダーを作成でき、このプロバイダーはキャッシュにデプロイされます。 次に、キャッシュはデプロイされたすべての依存関係を削除する必要があるかどうかをチェックします。

カスタム プロバイダーを作成し、それをキャッシュにデプロイして、アプリケーションでカスタム依存関係を使用できます。 次のコード スニペットは、キャッシュに項目を追加するときに、Cosmos DB 同期用にデプロイされたカスタム プロバイダーを .NET コードで使用する方法を示しています。

Customer customer = LoadCustomerFromDB(customerId);

CacheDependency cosmosDbDependency = new CosmosDbNotificationDependency<Customer>(. . .) ;

var cacheItem = new CacheItem(customer);
cacheItem.Dependency = cosmosDbDependency;
cache.Insert("Customer:" + customer.Id, cacheItem);

OleDB の依存関係

OleDB の依存関係 OleDB 依存関係は次によって使用されます。 NCache データベースが SQL Server でも Oracle でもなく、OLEDB 準拠のデータベースである場合。データが非常に急速に変化する場合に乱雑になる可能性があるイベント通知を望まない場合は、SQL Server および Oracle で DbDependency を使用することもできます。

DbDependency では、というテーブルを作成します。 ncacheデータベース内の _db_sync には、DbDependency を持つキャッシュされた項目ごとに XNUMX 行が含まれます。 データベース内の対応するデータが変更されたときに、このテーブル内の行を更新するようにデータベース トリガーを変更します。 NCache 更新された行についてこのテーブルをポーリングするため、XNUMX 回のポーリングで、 NCache 数千行をフェッチし、データベースと同期します。

.NET コードで DbDependency を使用する方法は次のとおりです。

DBCacheDependency oledbDependency = DBDependencyFactory.CreateOleDbCacheDependency(connectionString, "PrimaryKey:dbo.Products");

var cacheItem = new CacheItem(product);
cacheItem.Dependency = oledbDependency;
cache.Insert(key, cacheItem);

CLR手順

キャッシュ内に非常に多くの項目があり、それらすべてをデータベースと同期する必要がある場合は、 CLR手順 Windows 上の SQL Server では。 この CLR プロシージャは、関連するデータが変更されたときにデータベース トリガーから呼び出されます。 この CLR プロシージャにより、非同期が行われます。 NCache API 呼び出しは、対応するキャッシュされたアイテムをキャッシュに追加、更新、またはキャッシュから削除します。

以下は、オブジェクトが更新された場合にそれを削除する CLR プロシージャの例です。

[Microsoft.SqlServer.Server.SqlProcedure]
public static void RemoveOnUpdate(string cacheName, string key)
{            
    cacheName = "demoClusteredCache";
    Cache cache = CacheManager.GetCache(cacheName);
    cache.RemoveAsync(key);
}

リードスルーハンドラーによる自動リロード

データベース同期のデフォルトの動作では、データベース内の対応するデータが変更されると、キャッシュされた項目がデータベースから削除されます。 ただし、単に最新バージョンのデータで更新したい場合もあります。

このニーズに対応するために、 NCache データベース同期と リードスルー ハンドラー機能 NCache。 これとともに、 NCache 単純に、Read-through ハンドラーを呼び出して、キャッシュされたアイテムの最新のコピーを再読み込みし、それを使用してキャッシュを更新します。 この機能により、同期を柔軟に行うことができます。 NCache 任意の関係または NoSQL database これには以下 (およびそれ以上) が含まれるように構成されています。

  1. SQLサーバー
  2. オラクル
  3. コスモスDB
  4. MongoDBの

次のコード スニペットは、データを一括で自動リロードする方法を示しています。 NCache リードスルーを使用して Cosmos DB から。 詳細はブログでもご覧いただけます CosmosDB とキャッシュを同期する.

public Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList docs, CancellationToken cancellationToken) 
{
    cacheItems = cache.GetBulk(DocsKeys, new ReadThruOptions {Mode = ReadMode.ReadThruForced} );
    return Task.CompletedTask;
}

次はどうする?

NCache 詳細
30日間の無料インストールキーをダウンロード
パーソナライズされたLIVEデモをリクエストする
製品ドキュメントを読む

お問い合わせ(英語)

電話
©著作権 Alachisoft 2002 - . All rights reserved. NCache はダイヤテック株式会社の登録商標です。