キャッシュローダーとリフレッシャーを実装する
キャッシュスタートアップローダーとリフレッシャーを使用するには、 ICacheLoader
インターフェースを最初に実装する必要があります。 次に、ローダーとリフレッシャーのカスタム ロジックを次を使用して構成できます。 NCache 管理センター or コマンドラインツール. NCache カスタムロジックに基づいて、構成されたデータソースからデータをロードおよび更新します。 キャッシュの起動時に、 NCache その Init
Cache Startup Loader のメソッドを使用して初期化します。 キャッシュ スタートアップ ローダーの初期化が成功すると、実装された LoadDatasetOnStartup
データをキャッシュにロードするメソッド。 次に、 データセットの更新 決定されたキャッシュにロードされたデータを更新するメソッド 更新間隔.
次の例では、クライアントは ICacheLoader
インターフェイスを使用して、カスタム ローダーおよびリフレッシャー ロジックを構成します。 XNUMX つのデータセットを構成した場合、 NCache 管理センター: 製品 および サプライヤー. 次の実装ロード 製品 および サプライヤー キャッシュの起動時。 さらに、指定された更新時間間隔でこれらのデータセットを更新します。
キャッシュローダーのコンポーネントの詳細については、「キャッシュローダー」の章を参照してください。 キャッシュスタートアップローダーとリフレッシャーのコンポーネント.
キャッシュ ローダーとリフレッシャーの前提条件
- すべてを使用するために必要な標準的な前提条件について学習するには NCache サーバー側の機能については、指定されたページを参照してください サーバー側 API の前提条件.
- APIの詳細については、以下を参照してください。 Iキャッシュ, キャッシュ項目, Iキャッシュローダー.
- これはクラスライブラリプロジェクトである必要があります。
- ユーザーとの強い関係を維持するために、 キャッシュローダーを構成する NCache Management Center またはコマンド ライン ツール NCache クラスタ。
キャッシュローダーとリフレッシュャーの初期化
次のコードは、 Init
の方法 ICacheLoader
インターフェース。 このメソッドは、パラメーターを入力として受け取り、それらに対して値を割り当てます。
public void Init(IDictionary<string, string> parameters, string cacheName)
{
cache = CacheManager.GetCache(cacheName);
connectionString = parameters.ContainsKey("ConnectionString") ? parameters["ConnectionString"] : null;
if (connectionString != null)
{
connection = new SqlConnection(connectionString);
}
}
Note
操作がフェイルセーフであることを保証するために、で説明されているように、アプリケーション内の潜在的な例外を処理することをお勧めします。 失敗の処理.
キャッシュの起動時にデータをロードする
次の実装は、 LoadDatasetOnStartup
メソッドは プロダクト データ ソースから取得してキャッシュに追加します。 の LoadDatasetOnStartup
キャッシュにロードされたデータに関する情報を保持するユーザー コンテキストを返します。 このメソッドは、キャッシュがキャッシュ内のデータのプリロードを開始するときに呼び出されます。
public object LoadDatasetOnStartup(string dataset)
{
// Create a list of datasets to load at cache startup
IList<object> datasetToLoad;
switch (dataset.ToLower())
{
// If dataset is products, fetch products from data source to load in cache
case "products":
datasetToLoad = FetchProductsFromDataSource();
// Insert fetched products in the cache
foreach (var product in datasetToLoad)
{
string key = $"ProductID:{product.Id}";
cache.Insert(key, product);
}
break;
// If dataset is suppliers, fetch suppliers from data source to load in cache
case "suppliers":
datasetToLoad = FetchSuppliersFromDataSource();
// Insert fetched suppliers in the cache
foreach (var supplier in datasetToLoad)
{
string key = $"SupplierID:{supplier.Id}";
cache.Insert(key, supplier);
}
break;
default:
// Invalid dataset
}
// User context is the time at which datasets were loaded in the cache
object userContext = DateTime.Now;
return userContext;
}
データセットを更新
次のコードは、キャッシュリフレッシャーが呼び出されるたびに、起動時にキャッシュにロードされたデータを更新する方法を実装しています。 ザ データセットの更新 メソッドは、によって返されたユーザー コンテキストを使用します。 LoadDatasetOnStartup 更新するデータを確認する方法。
public object RefreshDataset(string dataset, object userContext)
{
DateTime? lastRefreshTime;
switch (dataset.ToLower())
{
// If dataset is products, fetch updated products from data source
case "products":
lastRefreshTime = userContext as DateTime?;
IList<Product> productsToRefresh = FetchUpdatedProducts(lastRefreshTime) as IList<Product>;
// Insert updated products in the cache
foreach (var product in productsToRefresh)
{
string key = $"ProductID:{product.Id}";
CacheItem cacheItem = new CacheItem(product);
_cache.Insert(key, cacheItem);
}
break;
// If dataset is supplier, fetch updated suppliers from data source
case "suppliers":
lastRefreshTime = userContext as DateTime?;
IList<Supplier> suppliersToRefresh = FetchUpdatedSuppliers(lastRefreshTime) as IList<Supplier>;
// Insert updated suppliers in the cache
foreach (var supplier in suppliersToRefresh)
{
string key = $"SupplierID:{supplier.Id}";
CacheItem cacheItem = new CacheItem(supplier);
_cache.Insert(key, cacheItem);
}
break;
default:
// Invalid dataset
}
// User context is the time at which datasets were refreshed
userContext = DateTime.Now;
return userContext;
}
データセットを取得して更新する
データセットを取得して更新する メソッドは、実行時に事前構成されたデータセットを更新するカスタム ロジックを実装します。 RefreshPreference
。 このメソッドはユーザー コンテキストを取得し、 リフレッシュ設定 指定されたデータセットによって異なります。
public IDictionary<string, RefreshPreference> GetDatasetsToRefresh(IDictionary<string, object> userContexts)
{
DateTime? lastRefreshTime;
bool datasetHasUpdated;
// Create a dictionary for datasets to refresh with their Refresh Preference
IDictionary<string, RefreshPreference> DatasetsToRefresh = new Dictionary<string, RefreshPreference>();
foreach (var dataset in userContexts.Keys)
{
switch (dataset.ToLower())
{
// If dataset is products, check if dataset has been updated in data source
// if yes, then refresh the dataset now
case "products":
lastRefreshTime = userContexts[dataset] as DateTime?;
datasetHasUpdated = HasProductDatasetUpdated(dataset, lastRefreshTime);
if (datasetHasUpdated)
{
DatasetsToRefresh.Add(dataset, RefreshPreference.RefreshNow);
}
break;
// If dataset is suppliers, check if dataset has been updated in data source
// if yes, then refresh dataset on next time of day
case "suppliers":
lastRefreshTime = userContexts[dataset] as DateTime?;
datasetHasUpdated = HasSupplierDatasetUpdated(dataset, lastRefreshTime);
if (datasetHasUpdated)
{
DatasetsToRefresh.Add(dataset, RefreshPreference.RefreshOnNextTimeOfDay);
}
break;
default:
// Invalid dataset
}
}
// Return the dictionary containing datasets to refresh on polling with their refresh preferences
return DatasetsToRefresh;
}
すべてのリソースを破棄する
結局、 Dispose
このメソッドでは、無駄を防ぐためにすべてのリソースが閉じられているか削除されていることが保証されます。
Note
キャッシュローダー/リフレッシャーを構成する NCache を参照して キャッシュローダーとリフレッシャーを構成する ヘルプについては、管理者ガイドを参照してください。
その他のリソース
NCache キャッシュ ローダーとリフレッシャーのサンプル アプリケーションを提供します。 GitHubの.
も参照してください
。ネット: Alachisoft.NCache。ランタイム 名前空間
Java: comの。alachisoft.ncache.runtime.cacheloader 名前空間