NCache は、データベースへの高価な移動を削減しながら、アプリケーションの高速化に役立つ分散キャッシュ ソリューションです。 これにより、多数のクライアントがデータベースからキャッシュに移動され、データベースの負荷が軽減され、ハードウェアをアップグレードする必要がなくなるため、スケーラビリティが向上します。
データをキャッシュに追加するときは、実際にはデータベースからの元のデータのコピーをキャッシュに配置します。 データベース内の特定のデータが更新されると、キャッシュ内のそのコピーは影響を受けないため、古くなります。 ただし、この状況は、データベース内の同じデータを更新している複数のアプリケーションがあり、そのすべてがキャッシュ内のデータの更新を担当しているわけではない場合にのみ発生します。
一部のアプリケーションがデータベース内のデータを更新しているが、キャッシュは更新していないような状況では、データベース内のデータに対する変更がキャッシュ内のデータにも影響するように、キャッシュをデータベースと同期する方法が必要です。 これは、イベント通知を有効にするか、データベースをポーリングして更新を探すことによって実現できます。 ただし、アプリケーションが SQL Server 2000、古いバージョンの Oracle、またはイベント通知をサポートしていない他の OLEDB 準拠データベースなどのデータベースを使用している場合、アプリケーションと同期する唯一の方法はポーリングを使用することです。
この記事ではさらに、その方法を学習します。 NCache ポーリングを使用してキャッシュをデータベースと同期します。
以下は、ポーリングを通じてデータベースをキャッシュと同期するためにアプリケーションに実装する必要があるサンプルコードです。
String conString = "Provider=OraOLEDB.Oracle;User Id=SYSTEM;" +
"Password=xe;Data Source=xe;OLEDB.NET=true;";
OleDbConnection con = new OleDbConnection(conString);
con.Open();
String sqlCmd = "SELECT ProductID, ProductName FROM dbo.Products WHERE ProductID < 12";
OleDbCommand cmd = new OleDbCommand(sqlCmd,con);
cmd.ExecuteReader();
OleDbDataReader myReader = cmd.ExecuteReader();
List<Products> lstProducts = new List<Products>();
while (myReader.Read())
{
Products cProducts = new Products();
cProducts.ProductID = myReader.GetInt32(0);
cProducts.ProductName = myReader.GetString(1);
cProducts.SupplierID = myReader.GetInt32(2);
cProducts.UnitPrice = myReader.GetDecimal(4);
CacheItem item = new CacheItem(cProducts);
DBCacheDependency dependency =
DBDependencyFactory.CreateOleDbCacheDependency(conString,"");
_cache.Insert(cProducts.ProductID + ":dbo.Products", cProducts,
dependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.Default);
lstProducts.Add(cProducts);
};
myReader.Close();
con.Close();
上記のコードでは、データベースから XNUMX つの行がロードされ、オブジェクトに変換されます。 その後、CreateOleDbCacheDependency を使用してデータベースとの接続を確立し、対象となる行を登録します。 NCache のアップデートを探す必要があります。 CreateOleDbCacheDependency を使用して OleDB の依存関係を作成する場合は、コードの前半で特定の行をフェッチするために使用したのと同じ SQL ステートメントをそれに指定する必要があることに注意してください。
上記のコードが実装されて実行されると、 NCache 指定されたクリーン間隔ごとにデータベースにアクセスし続け、更新された行をフェッチし、キャッシュ内の対応する期限切れの行と置き換えます。
上記のコードでその方法をすでに見てきました。 NCache データベースとの同期を実装します。 ただし、ポーリング ベースの同期を有効にする手順にはさらにいくつかの手順が必要です。これについては以下で説明します。
テーブルを作成するSQLは次のとおりです。
Create table ncache_db_sync
(
cache_key varchar2(256) not null enable,
cache_id varchar2(256) not null enable,
modified number(2,1) default 0 not null enable,
work_in_progress number(2,1) default 0 not null enable,
primary key (cache_key, cache_id) enable
);
/*Here is the SQL to create the trigger:*/
Create Trigger MyTrigger
After
Update [or delete] on dbo.Products
Referencing OLD AS oldRow
For each row
Begin
Update ncache_db_sync
Set modified = 1
Where cache_key = (Cast(Select oldRow.ProductID FROM deleted OLD) As VarChar)
+ ':dbo.Products'
End Trigger;
注: cache_key は、対応するレコードをキャッシュに追加するために使用されるキーと同じである必要があります。
トリガーと「」の方法ncache_db_sync テーブルが機能するのは、データベース テーブル内の値が変更または削除されるたびに、適切なトリガーが自動的に呼び出されるということです。 トリガーは、「」の「modified」フィールドの値を変更します。ncache_db_sync' テーブルが 1 に設定され、主キーの値が変更されたことを示します。
NCache 指定された期間ごとに、キャッシュ内の期限切れアイテムと不要なアイテムのクリーンアップを実行します。 この期間をクリーンインターバルと呼びます。 クリーン間隔ごとに、 NCache また、「変更された」フィールドの値も検索します。ncache_db_sync テーブル。 値が「1」であることが判明した場合、 NCache 次に、適切な期限切れのキーをキャッシュから削除し、更新されたすべての行をデータベースからフェッチしてキャッシュに配置します。
注意: