NCache 分散キャッシュをSQL Server、Oracle、およびNoSQLデータベースと自動的に同期することで、リアルタイムのデータ一貫性を実現します。これにより、アプリケーションは常に最新のデータをミリ秒以下のパフォーマンスで提供し、イベント駆動型の通知とポーリングによって古いデータを排除します。
NCache は、アプリケーションデータをキャッシュすることでアプリケーションのパフォーマンスを向上させる、極めて高速で線形スケーラブルな分散キャッシュです。アプリケーションデータをキャッシュすると、キャッシュ内にデータのコピーが作成され、そのコピーはデータベースにも存在します。データベース内のデータが変更された場合は、キャッシュも更新され、データベースとの整合性が常に保たれるようにする必要があります。
この状況に対処するには、 NCache リレーショナルデータベースまたは NoSQL データベースでデータが変更されるとキャッシュが同期される強力なデータベース同期機能を提供します。ここでの同期とは、対応するキャッシュされたアイテムをキャッシュから削除する(またはキャッシュを再読み込みする)ことを意味します。 リードスルー). NCache データベース同期のために次の機能が提供されます。
次の図は、その方法の基本的なアーキテクチャを示しています。 NCache データベース同期をサポートします。
Sql依存性 によって使用されます NCache データベースが SQL Server の場合。 キャッシュ内で項目を追加または更新するときに、キャッシュされた項目に対して SqlDependency を指定できます。 SQL Server はデータセットの追加、更新、または削除を監視し、通知します。 NCache データベースの更新後、ほぼ即座にSQL通知を介して通知されます。これらは.NETイベントに変換されるデータベース通知です。
SqlDependency は次のいずれかになります。
このトピックの詳細については、 キャッシュをSQLServerと同期する ドキュメント。
動的に構築された 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);
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);
}
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 の依存関係 によって使用されます 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手順 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データベースであれば、以下を含む(その他多数):
次のコードスニペットは、データを一括して自動再ロードする方法を示しています。 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);
| シナリオ | 推奨メカニズム | NCache 使用された機能 |
|---|---|---|
| 標準SQL/Oracleの更新 | データベース通知 | Sql依存性 / Oracleの依存関係 |
| 大規模/一括更新 | CLR手順 | CLR ストアド プロシージャ (非同期) |
| 汎用/レガシーデータベース | ポーリング | Db依存関係 (OLEDB経由) |
| NoSQLアーキテクチャ | 変化の流れ | カスタム依存関係による MongoDB 同期 |
©著作権 Alachisoft 2002 - . All rights reserved. NCache はダイヤテック株式会社の登録商標です。