ポーリングによる分散キャッシュとデータベースの同期

概要

NCache は、データベースへの高価な移動を削減しながら、アプリケーションの高速化に役立つ分散キャッシュ ソリューションです。 これにより、多数のクライアントがデータベースからキャッシュに移動され、データベースの負荷が軽減され、ハードウェアをアップグレードする必要がなくなるため、スケーラビリティが向上します。

データをキャッシュに追加するときは、実際にはデータベースからの元のデータのコピーをキャッシュに配置します。 データベース内の特定のデータが更新されると、キャッシュ内のそのコピーは影響を受けないため、古くなります。 ただし、この状況は、データベース内の同じデータを更新している複数のアプリケーションがあり、そのすべてがキャッシュ内のデータの更新を担当しているわけではない場合にのみ発生します。

一部のアプリケーションがデータベース内のデータを更新しているが、キャッシュは更新していないような状況では、データベース内のデータに対する変更がキャッシュ内のデータにも影響するように、キャッシュをデータベースと同期する方法が必要です。 これは、イベント通知を有効にするか、データベースをポーリングして更新を探すことによって実現できます。 ただし、アプリケーションが SQL Server 2000、古いバージョンの Oracle、またはイベント通知をサポートしていない他の OLEDB 準拠データベースなどのデータベースを使用している場合、アプリケーションと同期する唯一の方法はポーリングを使用することです。

この記事ではさらに、その方法を学習します。 NCache ポーリングを使用してキャッシュをデータベースと同期します。

コードでの DbDependency の使用

以下は、ポーリングを通じてデータベースをキャッシュと同期するためにアプリケーションに実装する必要があるサンプルコードです。

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 データベースとの同期を実装します。 ただし、ポーリング ベースの同期を有​​効にする手順にはさらにいくつかの手順が必要です。これについては以下で説明します。

  1. テーブルを作成する'ncacheOracle データベースに _db_sync を追加し、(1)cache_key VARCHAR2、(2)cache_id VARCHAR2、(3)modified NUMBER、および (4)work_in_progress NUMBER の XNUMX つのフィールドを追加します。
  2. テーブルを作成する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
        );
  3. 通知が必要なテーブルごとに UPDATE トリガーと DELETE トリガーを作成します。 トリガーは、 ncache_db_syncテーブルを1に。
  4. /*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 次に、適切な期限切れのキーをキャッシュから削除し、更新されたすべての行をデータベースからフェッチしてキャッシュに配置します。

注意:

  1. これは行ベースの依存関係です。 キャッシュ キーはテーブルの主キー値に関連付けられます。 これは、主キーを持つ行が変更された場合にのみ項目が期限切れになることを意味します。
  2. cache_key 値は、対応するレコードをキャッシュに追加するために使用されたものと同じである必要があります。

次はどうする?

お問い合わせ(英語)

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