アプリケーションの頻繁に使用されるデータをキャッシュすることは、非常に有能な方法です。 ただし、キャッシュされたデータがOracleデータベースと同期していることを確認することがジレンマです。 これを克服する秘訣は、アイテムのTTL(Time To Live)を推測し、それをキャッシュするデータの有効期限を使用することです。
このスキームがどれほど人気があるとしても、これは、そのアイテムがデータベース内で変更されないままになる期間についての単なる知識に基づいた推測のままです。 そして、推測は常に正確であるとは限りません。 アプリケーションがデータセンシティブであり、不正確なデータのフェッチと処理がその目的に反する場合、有効期限を使用するとかなりのコストがかかります。
この窮状からあなたを救うのは、次のようなキャッシュでデータベース同期メカニズムを使用することです。 NCache、Oracleデータベースで更新された場合、対応するキャッシュデータを自動的に削除します。
NCache 詳細 データベースへのキャッシュの依存関係 データの有効期限のテクニック
使い方 NCache OracleServerと同期する
Oracle Dependencyは、データベース内のデータセットが変更されたときにすべてのデータベース・クライアントに通知するイベント通知を使用します。 バックエンド情報: NCache この機能を使用して、自身をOracleServerのクライアントとして登録します。 これは、Oracleデータセットでデータが変更されるたびに、 NCache 自動的に通知されます。 この情報を使用して、 NCache キャッシュされたすべてのアイテムとそれに対応するデータセットのマップを保持します。 だから、いつでも NCache 変更が通知されると、対応するキャッシュアイテムがキャッシュから無効になり、次にクライアントアプリが要求したときに、更新されたアイテムがフェッチされます。
同期しましょう NCache OracleServerを使用
eコマースアプリケーションの簡単な例を取り上げます(.NET Core ベース)その全体の成功はその正確さにあります。 何千ものクライアントが毎分オンラインショッピングのためにこのアプリケーションにアクセスするため、このアプリケーションのデータはキャッシュされています。
ここで、非常に一般的なシナリオを考えてみましょう。 顧客A ストアが持っていた最後のXboxシリーズXを購入しました。 アプリサーバーはそのアイテムの量をデータベースから削除しますが、キャッシュはまだこの変更を認識していません。 この不一致は、顧客の怒りにつながります 顧客B 同じ製品が好きで、支払いを行い、支払い成功のメッセージで通知を受け取りますが、最新のXboxSeriesXを受け取りません。
ここで、メインのOracleデータベースでデータが変更されるたびにアプリケーションがデータの整合性の問題に直面しないようにするために、 NCache のサポートを提供します Oracleの依存関係.
この依存関係機能を使用するには、 NCache Oracleクエリをパラメータ化できます OracleCacheDependency 実行時にパラメータ値を受け取るメソッド。 これを行うと、Oracle Serverでクエリをコンパイルする必要がある回数が減り、アプリケーションのパフォーマンスがXNUMX分のXNUMXに向上します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
string connectionString = ConfigurationManager.AppSettings["connectionstring"]; string query = "SELECT ROWID, ProductID, ProductName, UnitPrice FROM Products WHERE ProductID = :productID"; var param = new OracleCmdParams(); param.Type = (OracleCmdParamsType.VarChar); param.Value = "XBoxX"; param.Direction = OracleParameterDirection.Input; // Adding the populated parameter to a dictionary Dictionary<string, OracleCmdParams> oracleParam = new Dictionary<string, OracleCmdParams>(); oracleParam.Add("productID", param); // Create Oracle Dependency var oracleDependency = new OracleCacheDependency(connString, query, OracleCommandType.Text, oracleParam); Product product = FetchProductFromDB(param.Value); string key = $"Product:{product.ProductID}"; // Create a CacheItem, add Oracle dependency, and cache it var cacheItem = new CacheItem(product); cacheItem.Dependency = oracleDependency; cache.Insert(key, cacheItem); |
NCache 詳細 Oracleへのキャッシュの依存関係 Oracle環境のセットアップ
OracleCacheDependencyでできることは他にもたくさんあります。 これは、このOracleDependencyでサポートされているいくつかの非常に便利な機能のリストです。
リードスループロバイダーを介したキャッシュアイテムの自動リロード
OracleCacheDependencyは、データソースで変更されたキャッシュアイテムを無効にする責任があります。 NCache は、大阪で バッキングソースプロバイダーを読み通す キャッシュを無効にするだけでなく、変更されたアイテムの最新バージョンをOracleサーバーからフェッチする場合に備えて。 と 読み飛ばし オプションが有効、 NCache その リードスルー OracleServerがキャッシュに変更を通知するたびに更新されたデータをフェッチするプロバイダー。
次のコードは、この機能を実現する方法を説明しています。
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add oracle dependency to it CacheItem item = new CacheItem(product); item.Dependency = oracleDependency; // Resync if enabled, will automatically resync cache with Oracle server item.ResyncOptions = new ResyncOptions(true); //Add cache item in the cache with Oracle Dependency and Resync option enabled cache.Insert(key, item); |
NCache 詳細 Oracleへのキャッシュの依存関係 リードスループロバイダー
ストアドプロシージャベースのOracle依存関係
NCache サポート ストアドプロシージャベースのOracle依存関係 すべてのOracleクエリをOracleデータベース内に保持することが好みの場合。 これらのストアドプロシージャはOracleサーバーでプリコンパイルされており、動的なOracleクエリよりもはるかに高速に実行されます。
Oracleでストアドプロシージャを作成するには、次の例を参照してください。
1 2 3 4 5 6 |
CREATE PROCEDURE SelectProduct (ProductID IN VarChar) AS BEGIN SELECT ProductID, Quantity, Price FROM Products WHERE ProductID = :productID; END; |
.NETアプリケーションでこのストアドプロシージャを呼び出すのは簡単です。 例として次のスニペットを使用してください。
1 2 3 4 5 6 7 8 9 10 |
OracleCmdParams param = new OracleCmdParams(); param.Type = (OracleCmdParamsType.VarChar); param.Value = "XBoxX"; param.Direction = OracleParameterDirection.Input; var oracleCmdParams = new Dictionary<string, OracleCmdParams>(); oracleCmdParams.Add("productID", param); // Create Oracle Dependency var oracleDependency = new OracleCacheDependency(connString, SelectProduct, OracleCommandType.StoredProcedure, oracleCmdParams); |
NCache 詳細 Oracleへのキャッシュの依存関係 ストアドプロシージャを使用したOracleの依存関係
同期する理由 NCache Oracle Serverを使用しますか?
古いデータを処理しているという理由だけで、彼らが一生懸命取り組んできたアプリケーションが失敗することを誰も望んでいません。 あなたはビジネスを失い、そのように直面します。 だが NCache、非常に簡単に、キャッシュをOracleデータベースと同期させて、代わりに失敗しないように使用しているキャッシュを保証するOracleDependencyを提供します。
NCache 詳細 ダウンロード NCache エディションの比較