著者:イクバルカーン
NCache 中間層のアプリケーションの近くにデータをキャッシュできるため、データベースへの高額な移動を減らすことができます。 これにより、アプリケーションが大幅に高速化されます。 また、データベースの負荷が軽減され、ハードウェアをアップグレードせずに多数のクライアントを処理できるため、よりスケーラブルになります。
ただし、データをキャッシュすると、実際にはデータベースの外部にそのコピーが作成されます。 これにより、データベース内のデータは変更されますが、キャッシュされたコピーは変更されずに古くなるリスクがあります。 幸いなことに、この状況は、データベース内の同じデータを変更する複数のアプリケーションがあり、それらのすべてがキャッシュを更新しているわけではない場合にのみ発生します。
他のアプリケーションがデータベース内のデータを変更していて、キャッシュを更新していない状況では、キャッシュがデータベースと直接同期できるようにするためのメカニズムが必要です。 これは、複数の異なる方法で可能です。 データベースがSQLServer2008/2012の場合、キャッシュは同期に.NETイベント通知を使用できます。これは非常に効率的です。 ただし、データベースがSQL Server 2000、Oracle、またはその他のOLEDB準拠のデータベースである場合、同期する唯一の方法は、データベースをポーリングして更新を探すことです。 もちろん、この方法は、キャッシュがデータベースに不必要に多くアクセスすることになるため、それほど効率的ではありません。
この記事では、その方法について説明します NCache .NETイベント通知を使用して、キャッシュをSQLServer2008/2012データベースと同期します。
この機能を使用するには、.NET アプリケーション コードで指定する必要があるものを次に示します。 NCache Microsoftと非常によく似たインターフェイスを提供します SqlCacheDependency
内部的にはインターフェース NCache 使っています SqlCacheDependency
SQLServer2008/2012と同期するオブジェクト。
public class Program {
public static void Main(string[] args)
{
NCache.InitializeCache("myCache");
Customer cust = new Customer();
cust.CustomerID = "ALFKI";
LoadCustomer(cust);
List<Customer> custList = FindCustomers("San Francisco");
// Do your regular work here...
NCache.Cache.Dispose();
}
// A standard Load method that loads a single row from database
public Customer LoadCustomer(Customer cust)
{
String key = "Customer:CustomerID:" + cust.CustomerID;
Customer cust2 = (Customer)NCache.Cache.Get(key);
if (cust2 != null)
return cust2;
CustomerFactory custFactory = new CustomerFactory();
// Load a single customer from the database
// SELECT * FROM Customers WHERE CustomerID = 'ALFKI'
custFactory.Load(cust);
// Create a SqlCacheDependency for this item
CacheItem item = new CacheItem(cust);
item.Dependency = SqlDependencyFactory.CreateSqlYukonDependency(connectionString,
"SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'");
// Store item in the cache along with SqlCacheDependency
NCache.Cache.Insert(key, item);
return cust;
}
// A query method
public List<Customer> FindCustomers(String city)
{
String key = "List<Customer>:City:" + city;
List<Customer> custList = (List<Customer>)NCache.Cache.Get(key);
if (custList != null)
return custList;
CustomerFactory custFactory = new CustomerFactory();
// Load a list of customers from database based on a criteria
// SELECT * FROM Customers WHERE City = 'San Francisco'
custList = custFactory.FindByCity(city);
// Create a SqlCacheDependency for this list of customers
CacheItem item = new CacheItem(custList);
item.Dependency = SqlDependencyFactory.CreateSqlYukonDependency(connectionString,
"SELECT CustomerID FROM Customers WHERE City = '" + city + "'");
// Store list of customers in the cache along with SqlCacheDependency
NCache.Cache.Insert (key, item);
return custList;
}
}
上記のコードは、指定できるXNUMXつの異なる状況を示しています SqlCacheDependency
。 1 つ目は、データベースから 1 つの行をロードし、それをオブジェクトに変換し、キャッシュに保存するときです。この場合、この単一行をフェッチするためにコード内で使用したのと同等の SQL ステートメントを指定する必要があることに注意してください。この SQL ステートメントは次に使用されます。 SqlCacheDependency データベースとの接続を確立し、SQLServer2008/2012が.NETイベント通知を送信する行を登録するオブジェクト。
XNUMX番目の状況は、データベースから行のコレクションをオブジェクトのコレクションとしてフェッチし、コレクション全体を個別のオブジェクトとしてキャッシュに格納する場合です。 この場合、作成する必要があります SqlCacheDependency
これは、同じSQLステートメントを使用して、データベースから実行したのと同じ行をフェッチします。 こちらです、 NCache これらの行のいずれかが変更された場合、.NETイベント通知をに送信する必要があることをSQLServer2008/2012に通知します NCache.
上記のコード例は、 SqlCacheDependency
あなたのコードで。 もう1つの状況は、関連するオブジェクトのコレクションをCustomerにフェッチしようとしている場合です(たとえば、XNUMX-n関係)。 そのような状況では、Customerオブジェクトのコレクションをフェッチするために行ったのとまったく同じことを行います。 変更されるのは、関連するオブジェクトをフェッチするために使用されているSQLステートメントだけです。
あなたが与えるSQLステートメントに注意してください CreateSqlYukonDependency()
メソッドは使用してはならない "SELECT * ..."
フォーマット。 の一部としてXNUMXつ以上の列名を指定する必要があります SELECT
声明。 さもないと、 SqlCacheDependency
動作しません。
前にSQLServer2008/2012でサービスブローカーを有効にする必要があります NCache 使用することができます SqlCacheDependency
。 これにより、SQLServer2008/2012はイベント通知をに送信できます NCache データベース内のデータが変更されたことを通知します。
ALTER DATABASE Northwind SET ENABLE_BROKER;
GO
ということに注意してください NCache 自動的に呼び出します SqlCacheDependency.Start()
独自のコード内からのメソッド。 直接対話することはありません SqlCacheDependency
したがって、電話する必要はありません "Start()"
その上でメソッド。
これで、アプリケーションを実行する準備が整いました。 NCache データをキャッシュするための呼び出し。 今、あなたが何かをキャッシュするときはいつでも NCache, NCache SQL Server 2008/2012に通知し、SQL Server 2008/2012でこのデータが変更されると、.NETイベント通知をに送信します。 NCache. NCache 次に、データベースで変更されたため、このデータをキャッシュから削除します。 このように、次にアプリケーションがこのデータを必要とするとき、アプリケーションはキャッシュ内でデータを検出せず、データベースに移動してデータをフェッチしてから、キャッシュに格納します。
あなたが見たように、 NCache 分散キャッシュをSQLServer2008/2012データベースと同期するのが非常に簡単になります。 これで、キャッシュがデータベースと同期しなくなることはないという安心感を得ることができます。
著者: イクバル・カーンの勤務先 Alachisoft 、.NETおよびJava分散キャッシング、O / Rマッピング、SharePointストレージ最適化ソリューションを提供する大手ソフトウェア会社。 あなたは彼に到達することができます iqbal @alachisoft.COM.