キャッシュをSQL/NoSQLデータベースと同期する

NCache 分散キャッシュをSQL Server、Oracle、およびNoSQLデータベースと自動的に同期することで、リアルタイムのデータ一貫性を実現します。これにより、アプリケーションは常に最新のデータをミリ秒以下のパフォーマンスで提供し、イベント駆動型の通知とポーリングによって古いデータを排除します。

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

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

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

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

NCache データベース同期アーキテクチャ: リアルタイム イベント通知を介して SQL Server、Oracle、Cosmos DB、MongoDB と同期する分散キャッシュ (Windows/Linux)。
NCache RDBMSおよびNoSQL向けのリアルタイムデータベース同期アーキテクチャ。

SQLの依存関係

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

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

  • インラインクエリ
  • ストアドプロシージャ

このトピックの詳細については、 キャッシュをSQLServerと同期する ドキュメント。

SQL依存関係の仕組み

  • トリガー: SQL Server はデータの変更 (挿入、更新、または削除) を検出します。
  • 通知: SQL Serverは.NETイベント通知を NCache.
  • アクション: NCache 整合性を維持するために、アイテムを自動的に無効化または再ロードします。

インラインクエリの使用

動的に構築された SQL クエリを使用して SQL 依存関係を作成する方法を次に示します。

// Precondition: Cache is already connected
// Creating a connection string to get connected with the database
string connectionString = "your_connection_string_here";

// Getting products from the database
List<Product> products = FetchProductFromDB();

foreach (Product product in products)
{
    string productKey = $"Product: {product.ProductID}";

    // Creating an SQL dependency on the UnitPrice of product. Whenever the UnitPrice changes, the product is removed from the cache
    string query = $"SELECT UnitPrice FROM dbo.Products WHERE ProductID = {product.ProductID}";

    // Creating dependency
    SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query);

    CacheItem productItem = new CacheItem(product);

    // Adding Dependency to product item
    productItem.Dependency = dependency;

    // Adding CacheItem in cache
    _cache.Add(productKey, productItem);
}

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

ストアド プロシージャを使用して .NET コードで SQL 依存関係を使用する方法を次に示します。

// Precondition: Cache is already connected

// Creating connection string to get connected with the database
string connectionString = "your_connection_string_here";
string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID";

// Getting products from the database
List<Product> products = FetchProductFromDB();

// Creating dictionary of CacheItems
Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>();

foreach (Product product in products)
{
    string productKey = $"Product: {product.ProductID}";

    // Creating Param to be passed in stored procedure dictionary
    SqlCmdParams paramProductID = new SqlCmdParams
    {
        Type = CmdParamsType.Int,
        Value = product.ProductID
    };

    // Creating stored procedure params
    Dictionary<string, SqlCmdParams> parameters = new Dictionary<string, SqlCmdParams>();
    parameters.Add("@ProductID", paramProductID);

    CacheItem productItem = new CacheItem(product);

    // Creating an SQL dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache
    SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters);

    // Adding Dependency to product item
    productItem.Dependency = dependency;

    cacheItems.Add(productKey, productItem);
}
// Adding CacheItems in cache
_cache.AddBulk(cacheItems);

Oracleの依存関係

NCache OracleのContinuous Query Notification(CQN)を利用してデータベースの変更を監視します。従来のポーリングとは異なり、このプッシュベースのメカニズムにより、Oracleサーバーは必要な情報のみと通信します。 NCache SQLクエリで定義された特定のデータセットが変更された場合に、ネットワークオーバーヘッドが大幅に削減され、リアルタイムのキャッシュ同期が保証されます。

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

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

  • インラインクエリ
  • ストアドプロシージャ

Oracle Serverは、このデータセットの追加、更新、削除を監視し、発生した場合には通知します。 NCache データベースの更新後すぐに、Oracle Notifications を通じて通知されます。

インラインクエリの使用

インライン クエリを使用して .NET コードで Oracle 依存関係を使用する方法を次に示します。

// Precondition: Cache is already connected

// Creating a connection string to get connected with the database
string connectionString = "your_connection_string_here";

// Getting products from the database
List<Product> products = FetchProductFromDB();

foreach (Product product in products)
{
      string productKey = $"Product: {product.ProductID}";

      // Creating an Oracle dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache
      string query = $"SELECT ROWID, UnitPrice FROM Products WHERE ProductID = {product.ProductID}";

      OracleCacheDependency dependency = new OracleCacheDependency(connectionString, query);

      CacheItem productItem = new CacheItem(product);

      // Adding Dependency to product item
      productItem.Dependency = dependency;

      // Adding CacheItem in cache
      cache.Add(productKey, productItem);
}

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

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

// Precondition: Cache is already connected

// Creating a connection string to get connected with the database
string connectionString = "your_connection_string_here";

string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID";

// Getting products from the database
List<Product> products = FetchProductFromDB();

foreach (Product product in products)
{
      string productKey = $"Product: {product.ProductID}";
      // Creating Param to be passed in stored procedure dictionary
      OracleCmdParams paramProductID = new OracleCmdParams
      {
            Type = OracleCmdParamsType.Int32,
            Value = product.ProductID
      };
      // Creating stored procedure params
      Dictionary<string, OracleCmdParams> parameters = new Dictionary<string, OracleCmdParams>();
      parameters.Add("@ProductID", paramProductID);

      CacheItem productItem = new CacheItem(product);

      // Creating an Oracle dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache
      OracleCacheDependency dependency = new OracleCacheDependency(connectionString, spGetUnitPriceByProductID, OracleCommandType.StoredProcedure, parameters);

      // Adding Dependency to product item
      productItem.Dependency = dependency;

      // Adding CacheItem in cache
      cache.Add(productKey, productItem);
}

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

NCache カスタム通知依存関係により、キャッシュの無効化を柔軟かつ制御できます。MongoDB の場合、Change Streams を使用してキャッシュを MongoDB データベースとリアルタイムで同期できます。

これにより、MongoDB コレクションの挿入、更新、削除、置換が検出されます。 NCache 変更が発生すると、対応するキャッシュ エントリをすぐに削除または更新できるため、キャッシュが最新の状態に保たれ、データベースとの一貫性が保たれます。

以下は、.NET アプリケーションで MongoDB の変更ストリームを使用してこの同期を実装する方法の例です。

var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<Customer>>()
    .Match("{ operationType: { $in: ['insert', 'update', 'replace', 'delete'] } }");
 
var cursor = collection.Watch(pipeline);
await cursor.ForEachAsync(change =>
{
    string cacheKey = $"Customer:CustomerID:{change.FullDocument.Id}";
    cache.Remove(cacheKey);
});

OleDB の依存関係

OleDB の依存関係 によって使用されます NCache データベースがSQL ServerでもOracleでもないが、OLEDB準拠のデータベースである場合。また、SQL ServerとOracleでイベント通知が不要な場合は、DbDependencyを使用することもできます。イベント通知は、データが急速に変更される場合に通知が煩雑になる可能性があります。

DbDependencyでは、データベースにncache_db_syncというテーブルを作成します。このテーブルには、DbDependencyでキャッシュされたアイテムごとに1行が含まれます。データベーストリガーを変更して、データベース内の対応するデータが変更されたときにこのテーブルの行を更新します。 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)
    {

        // Connect to the cache
        ICache cache = CacheManager.GetCache(cacheName);

        // Remove specified item
        cache.Remove(key);

        // Dispose the cache
        cache.Dispose();
    }

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

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

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

  1. SQLサーバー
  2. オラクル
  3. MongoDBの

次のコードスニペットは、データを一括して自動再ロードする方法を示しています。 NCache リードスルーを使用してデータベースから取得します。詳細については、 こちら.

String[] keys = { "Product:1001", "Product:1002",
"Product:1003","Product:1004"};

// Specify the readThruOptions for Read-through operations
var readThruOptions = new ReadThruOptions();
readThruOptions.Mode = ReadMode.ReadThru;

// Retrieve the dictionary of Products with corresponding products
IDictionary<string, Product> retrievedItems = cache.GetBulk<Product>(keys, readThruOptions);

同期がサポートされている環境

  • リレーショナル: SQL Server、Oracle、PostgreSQL、MySQL (OLEDB/CLR 経由)。
  • NoSQL: MongoDB、Azure Cosmos DB。
  • カスタム: CustomDependency および Read-Through ハンドラーを介した任意のデータ ソース。

適切な同期メカニズムの選択

シナリオ 推奨メカニズム NCache 使用された機能
標準SQL/Oracleの更新 データベース通知 Sql依存性 / Oracleの依存関係
大規模/一括更新 CLR手順 CLR ストアド プロシージャ (非同期)
汎用/レガシーデータベース ポーリング Db依存関係 (OLEDB経由)
NoSQLアーキテクチャ 変化の流れ カスタム依存関係による MongoDB 同期

次はどうする?

よくある質問(FAQ)

NCache 「通知ベース」の同期モデルを採用しています。 Sql依存性 (NAIST) と Oracleの依存関係では、データベースはレコードが更新または削除された瞬間にキャッシュにリアルタイム信号を送信します。これにより、 NCache 古くなったアイテムを即座に無効化または再読み込みします。

はい。ネイティブ通知サポートのないデータベースの場合、 NCache ポーリングベースの依存関係 (DbDependency) を提供します。 NCache データベース内の同期テーブルの変更を定期的にチェックし、OLEDB 準拠のソースとの互換性を保ちます。

更新量が多い環境では、CLRストアドプロシージャの使用をお勧めします。これらのプロシージャはSQL Server上で直接実行され、非同期呼び出しを行います。 NCache何千もの個別の .NET イベント通知のオーバーヘッドを防止します。

絶対に。 NCache Change Streams を使用して MongoDB と同期し、コレクションの更新をリアルタイムで検出します。その他の NoSQL ソースについては、 NCacheの Read-Through プロバイダーは、有効期限切れまたは無効化時にデータを自動的に再読み込みします。

NCache 高可用性を実現するように設計されています。データベースへの接続が中断された場合、 NCache 同期を再試行するか、古いデータが無期限に保持されないようにフォールバックとして TTL (Time-to-Live) 設定に依存するように構成できます。

お問い合わせ

電話

+1 214-619-2601 (米国)

+44 20 7993 8327 (英国)

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