皆さん、こんにちは。私はショーンです。今日は統合する方法を紹介します。 NCache あなたの既存の中に Entity Framework コア アプリケーション Oracle データベースで構成されているもの。これは、このデモ用にすでに構成したサンプル アプリケーションを使用して作業する実践的なデモンストレーションとして実行し、次の統合を行います。 NCache そこに。非常にエキサイティングなものをラインナップしました。どのようにやっていくかを説明しましょう。
したがって、ここで最初に用意するのはサンプル アプリケーション自体です。ご覧のとおり、サンプル アプリケーションがあり、ここでいくつかの注文、顧客、製品を取得しています。そして、これを Oracle データベースで動作するように構成しました。これをここでお見せします。コンテキストに移動すると、Oracle データベースを操作するためにこの UseOracle メソッドがここにあることがわかります。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseOracle("Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 20.200.20.112)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = NorthWindDB)));User Id=SYS;Password=MyPassword;DBA Privilege=SYSDBA;");
}
このプログラムを実際に実行する前に、データベースにアクセスして、何を扱っているかをお見せしましょう。したがって、私は Oracle の Northwind データベースを使用しています。テーブルがたくさんあるので、ここで作業しているテーブルを開いて確認できるようにしました。 1 つ目は ORDERS です。ここでは、これから扱う注文のプロパティを確認できます。それでは、製品を見てみましょう。したがって、これらはアプリケーションで取得またはフェッチする製品プロパティです。そして 3 番目のテーブルは CUSTOMERS で、ここで顧客のプロパティを確認できます。これが、これから扱う予定のテーブルのほぼすべてです。
それでは、実際にこれらのテーブルにクエリを実行して、内部にあるものを見てみましょう。つまり、Northwind データベースには 77 個の製品があり、これらがすべてここにある製品であることがわかります。それで、それはそれで結構です。次に、CUSTOMERS、顧客、および入力を見てみましょう。下までスクロールすると、完璧です。つまり、Northwind データベースには 89 人の顧客が含まれており、目の前にあるように、これらの顧客はすべてここに存在していることがわかります。
それでは、注文内容を見てみましょう。さて、たくさんの注文があるでしょう。一番下までスクロールしましょう - 完璧です!したがって、データベースには 830 件の注文があることがわかります。とてもたくさんの注文があり、ここですべての注文を見ることができます。したがって、アプリケーションでいくつかの基準を使用してフェッチを行うことになり、それをこれから実行していきます。
アプリケーションが実行されると、完全に表示されるようになります。ここで上にスクロールして、ID 25 ~ 50 の間でこれらの製品を取得できることがわかります。つまり、26 個の製品があります。英国からの顧客なので、顧客は 10280 名です。注文は 10300 ~ 21 なので、これらの XNUMX 件の注文があります。完璧です。
サンプルが動作していることがわかったので、設定に進むことができます。 NCache Entity Framework Core アプリケーションで。したがって、アプリケーションが動作するように構成すると、 NCache このデモで行うのは 5 つのステップと同じくらい簡単です。
それでは、ここでの最初のステップから始めましょう。 NCache Entity Framework Core NuGet パッケージをアプリケーションに追加します。したがって、アプリケーションの NuGet パッケージに移動すると、EntityFrameworkCore が見つかります。NCache NuGet パッケージ、ここにあります。これをアプリケーションにインストールしているので、ここで確認できます。そして、私はバージョン5.3.2.1を実行しています。これは、 NCache バージョン5.3 SP2。それで、完璧です。では、このタブを閉じて次のステップに進みましょう。
したがって、次のステップでは、 NCache Entity Framework Core 名前空間をアプリケーションに組み込みます。それでは、コードをもう一度開いて、ここでプログラムに入ってみましょう。そして、次のように追加します。
using Alachisoft.NCache.EntityFrameworkCore
完璧!したがって、これを保存し、モデル コンテキストに移動して、ここに貼り付けるだけです。完璧です。これが完了したので、次のステップに進むことができます。つまり、データベース コンテキストでキャッシュ構成を指定します。
そこで、設定方法まで下にスクロールして、これから使用するキャッシュの名前を追加し、 NCache 構成。これが私の「efcoreoraclecache」になります - 完璧です!そして、私は追加する必要があります NCache構成.構成 キャッシュの名前とDependencyType (Oracleになります) — 完璧です!ここでやるべきことはこれでほぼすべてです。
...
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string cache = "efcoreoraclecache";
NCacheConfiguration.Configure(cache, DependencyType.Oracle);
optionsBuilder.UseOracle("Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 20.200.20.112)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = NorthWindDB)));User Id=SYS;Password=MyPassword;DBA Privilege=SYSDBA;");
}
...
次に、これから扱うキャッシュを見てみましょう。したがって、これら 2 つのデモ マシン上で EFCoreOracleCache が構成されていることがわかります。このキャッシュの詳細を見てみましょう。したがって、ここから、このキャッシュを監視したい場合は、この監視ボタンをクリックします。これにより、キャッシュの健全性を示すモニターが表示されます。キャッシュが良好でクリーンで、作業に適した健全なキャッシュがあることがわかります。
詳細に戻って統計をクリックすると、キャッシュの統計を示すこのページが表示されます。ここで、モニターに戻り、アプリケーションに戻り、次のステップを開きます。
したがって、次のステップは、モデルをシリアル化可能にすることです。完璧。それでは、顧客モデルに進みます。それで、それはあそこになります。完璧。そして、私はちょうど追加するつもりです [シリアライズ可能] こっちだよ。完璧。それが完了したので、注文に進むことができます。そして、それはすでに次のようにマークされていることがわかります [シリアライズ可能]。そして、私の製品は、再び次のようにマークされています [シリアライズ可能]。したがって、すべてのモデルはシリアル化可能であり、ここに進んでも問題ありません。これで次のステップに進むことができます。
次のステップは、 NCache Entity Framework のコア拡張メソッド 私たちのアプリケーション内で。使用する拡張メソッドは実際にキャッシュするデータの種類によって異なるため、ここで少し休憩します。
したがって、キャッシュできるデータには 2 つのタイプがあります。1 つ目のタイプはトランザクションで、2 つ目のタイプは参照です。これらのタイプが何であるか、およびそれらをどのように処理する必要があるかについては、すぐに説明します。それでは、最初のものについて話しましょう。完璧。
したがって、処理できる最初のタイプのデータはトランザクション データです。ここで、トランザクション データとは、読み取りが集中する使用例と書き込みが集中する使用例を持つデータです。その好例としては、毎日非常に多くのフライトがあり、そのデータが毎日データベースに書き込まれ、また毎日データベースから取得されるフライト データが挙げられます。つまり、これは非常に読み取りと書き込みが集中するユースケースであり、そのデータがトランザクションであるとみなされることになります。私たちの場合、同様のユースケースを注文にマッピングできます。したがって、注文はトランザクションデータであると考えることができます。したがって、Entity Framework Core でのトランザクション データの処理について話しているときは、 NCache、私たちは使用します FromCache() 拡張メソッド。
この拡張メソッドを既存のクエリの前に関連付けると、初めて実行するときは標準クエリと同様に実行されます。アプリケーションはデータベースに移動し、そこからエンティティを取得します。ただし、今回はアプリケーションがそれらのエンティティをクラスター化されたキャッシュにキャッシュするため、次回アプリケーションがこれらのエンティティを取得しようとするとき、バックエンド データベースまでは到達せず、代わりにこれらのエンティティをクラスター化キャッシュからアプリケーションに戻します。それでは、この方法がどのように機能するかを見てみましょう。
したがって、私がアプリケーションに来ると、ここで注文を取りに来ます。そこで、注文キャッシュ オプションをいくつか追加します。そこで、ここに order_caching_options を追加します。これらは「新しい CachingOptions」になります。そこで、ここでストアのタイプを指定して、すべての注文の単一のコレクションを取得したいとします。そこで StoreAs.Collection を作成し、それをキャッシュに追加します。また、トランザクション データを扱う場合、このデータは頻繁に変更されるため、できるだけ定期的に更新する必要があるため、このデータに 10 分間の絶対有効期限を追加します。そこで、この有効期限を 10 分間設定して、10 分後にこのデータ セットがキャッシュ内で更新されるようにします。それで今、私は追加するつもりです .FromCache() 拡張メソッドを作成し、中に order_caching_options を追加すれば完璧です。これは完全に完璧であり、私たちがする必要があるのはこれだけです。
using OracleEFCore.Models;
using Alachisoft.NCache.EntityFrameworkCore;
namespace OracleEFCore
{
internal class Program
{
static void Main(string[] args)
{
using (var context = new Models.ModelContext())
{
//-----Orders-----
var order_caching_options = new CachingOptions()
{
StoreAs = StoreAs.Collection
};
order_caching_options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(10));
int upper_orderid = 10300;
int lower_orderid = 10280;
var order_resultset = context.Orders
.Where(o => o.Orderid >= lower_orderid && o.Orderid <= upper_orderid)
.FromCache(order_caching_options)
.ToList();
...
それでは、サンプルを実行して、何が得られるかを見てみましょう。完璧。サンプルが実行されます。ここでは変更がないので、ここでこれを閉じるだけです。これで、キャッシュ上で取得したリクエストを確認できるようになります。そして、この数も同様に増加していることがわかります。それでは、このキャッシュのキャッシュ キーをエクスポートし、クラスター化キャッシュに追加したばかりのコレクションを見てみましょう。完璧。したがって、キャッシュに追加されたこのコレクションを確認できます。すごいですね。
しかし、単一のコレクションをキャッシュに入れるのではなく、各注文を別個のエンティティとして保存したいと考えたとします。その場合は、ストアを別のエンティティになるタイプとして指定するだけです。
//-----Orders-----
var order_caching_options = new CachingOptions()
{
StoreAs = StoreAs.SeparateEntities
};
このアプリケーションを再度実行すると、すべての注文が別個のエンティティとしてキャッシュに入れられます。アプリケーションが実行されたので、閉じてみましょう。カウントが大幅に増加し、実行された追加とリクエストが確認できることがわかります。統計に移動すると、このカウントは 7 で、このカウントは 15 であることがわかります。完璧です。
ここで、キャッシュ キーをエクスポートし、キャッシュ内にあるキーを見てみましょう。完璧。したがって、キャッシュ内にこれら 22 個のキーまたはアイテムがあり、すべての注文は個別にキャッシュされます。これは、「FromCache()」拡張メソッドがどのように使用されるかをほぼ要約しています。
次に、参照データを処理する方法について説明します。したがって、参照データは、非常に読み取りが集中するユースケースを持つデータですが、トランザクション データほど頻繁には更新されません。この良い例は製品カタログです。したがって、製品の在庫や製品カタログがある場合、そのカタログをそれほど頻繁に更新することはありません。製品はおそらく月に 1 ~ 2 回変更されます。したがって、データベースからそのデータを読み取るだけで、実際にはデータベース内のデータをそれほど頻繁に更新するわけではない可能性が高くなります。したがって、そのデータをデータベースからクラスター化キャッシュに取り込み、データベースに移動するのではなく、高速のメモリ内クラスター化キャッシュまたはデータ ストアからそのデータを読み取ることが合理的です。これにより、アプリケーションに高いパフォーマンスとスケーラビリティが提供されます。 インメモリ分散キャッシュ.
したがって、参照データを扱う場合、最初に使用する方法は次のとおりです。 LoadIntoCache() 方法。現在、キャッシュへの読み込みメソッドは、Entity Framework Core で実行したクエリの結果を取得し、それらの結果をクラスター キャッシュにキャッシュするだけです。データの更新が予想される間隔でキャッシュへのロード メソッドを実行するように設定できるようになりました。
たとえば、当社の製品カタログは毎週更新されます。このメソッドを毎週実行するように設定すると、キャッシュ内のデータが更新され続け、キャッシュ内に常に最新のデータが存在するようになります。
データセット全体がキャッシュ内にあるので、3 番目の拡張メソッドを見てみましょう。 FromCacheOnly() 拡張メソッド。さて、 FromCacheOnly() extension メソッドは、バックエンド データベースにアクセスするのではなく、アプリケーションからクラスター化キャッシュにのみデータを取得できるようにする非常に優れた拡張メソッドです。を使用しているときは、バックアップされたデータベースにアクセスすることは決してありません。 FromCacheOnly() 拡張メソッド。
したがって、このメソッドを併用すると、 LoadIntoCache() この方法では、クラスター化キャッシュが最新の状態に保たれ、データベースと同期していることを確認し、クラスター化キャッシュ内からのみデータをフェッチする非常に強力なツール セットを使用できます。
では、これらのメソッドをどのように使用するかを見てみましょう。したがって、これらのメソッドを使用する場合、最初に行う必要があるのは、ここでこれらのモデルにクエリ インデックスを作成することです。顧客に問い合わせる場合、これを行う 1 つの方法は、 [クエリインデックス可能] ここの「Customer」の上にタグを付けます。ここに「QueryIndexable[]」タグがあり、これによりこのライブラリが取り込まれます。ただし、私の場合はこれを行う必要がないため、これをコメントアウトするだけです。その理由は、クラスター化キャッシュに移動して詳細を確認し、ここの [クエリ インデックス] タブまで下にスクロールすると、すべてのクエリ インデックスがすでにキャッシュに追加されていることがわかるからです。したがって、これらを追加したので、これらを動的に定義する必要はありません。
これでクエリ インデックスの準備が整ったので、すべての製品をデータベースからキャッシュにロードするコードがここにあります。したがって、先に進み、このコード部分のコメントを解除します。完璧!
// ------------------------Load ALL Products Into Cache------------------------
...
var products_caching_option = new CachingOptions
{
StoreAs = StoreAs.SeparateEntities
};
products_caching_option.SetAbsoluteExpiration(DateTime.Now.AddDays(10));
var all_products = (from products in context.Products
select products)
.LoadIntoCache(products_caching_option)
.ToList();
Console.WriteLine($"\n\nAll Products Loaded into cache : {all_products.Count}\n\n");
all_products.ForEach(product =>
{
Console.WriteLine(String.Format("{0,-25} {1,-40} {2,-10}", $"{product.Productid}", $"{product.Productname}", $"{product.Unitprice}"));
});
...
このコードで行っているのは、製品を別のエンティティに配置し、10 日間の有効期限を付けて追加するという設定だけです。それから、これ LoadIntoCache() メソッドは製品をキャッシュにロードしています。それでは、これを実行して、取得される結果を見てみましょう。完璧!ここで上にスクロールすると、そこに進みます。これら 77 個の製品すべてがキャッシュにロードされたことがわかります。
そして、キャッシュに入ったリクエスト、実行された追加、そしてずっと増加したカウントを確認できるとします。統計を開くと、59 つのパーティションに 41 個の項目があり、もう XNUMX つのパーティションに XNUMX 個の項目があることがわかります。
次に、キャッシュ キーをエクスポートして、持っているデータを見てみましょう。完璧!したがって、キャッシュ内に 100 個のキーがあり、すべての製品がキャッシュに取り込まれています。完璧!データセット全体が入ったので、このメソッドを再度実行する必要はありません。先に進んでこれにコメントします。
そして今、私たちは実行するつもりです FromCacheOnly() 以前に実行した製品クエリの拡張メソッド。したがって、「」を追加するだけです。 FromCacheOnly()。完璧!それでは、サンプルを実行して、このフェッチの結果を見てみましょう。完璧!これで、26 件の結果が得られました。これは、このアプリケーションをキャッシュなしで実行したときに得られたものと同じです。これは完全な結果を意味し、実行されたフェッチとキャッシュ上で取得したリクエストを確認できます。
これで、どのように使用できるかをほぼ要約できます。 FromCacheOnly() LoadIntoCache() 拡張メソッド。そして、EF Core 固有の話に移ります。 NCache 使用できる API。たとえば、拡張メソッドを使用したくなく、エンティティを作成してコンテキストに永続化し、それをキャッシュにプッシュする独立したエンティティを操作したいとします。良い、 NCache を使用してそれを行うことができます EFコア固有 NCache API。したがって、これらが機能する方法は、アプリケーション内の EF Core コンテキストからキャッシュ コンテキストをフェッチすることです。そして、そのキャッシュ コンテキストを取得したら、そのキャッシュ コンテキストを使用して、キャッシュにエンティティを挿入したり、キャッシュからエンティティを削除したりできます。
これを、 NCache SDK。これらは Entity Framework Core に固有のものであり、Entity Framework Core で想定されている方法で動作します。したがって、挿入データでは、出力文字列キャッシュ キーを持つ顧客を挿入することがわかります。これは、Entity Framework Core API によって提供されるキャッシュ キーです。
では、これがどのように機能するかを見てみましょう。アイテムまたはエンティティがどのようにキャッシュに永続化されるかがわかります。したがって、ここを下にスクロールすると、キャッシュ ハンドルを使用して顧客をキャッシュに追加できることがわかります。したがって、ここではこのコード部分のコメントを解除します。完璧!
//-------------------Add Customer Using Cache Handle-------------------
...
Cache cache = context.GetCache();
var cust = new Customer
{
Customerid = "HANIH",
Contactname = "Hanih Moos",
Contacttitle = "Sales Representative",
Companyname = "Blauer See Delikatessen",
};
var options = new CachingOptions
{
StoreAs = StoreAs.SeparateEntities
};
options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(10));
context.Customers.Add(cust);
context.SaveChanges(true);
cache.Insert(cust, out string cacheKey, options);
Console.WriteLine($"\n\nCustomer ID: {cust.Customerid} -> Added to Cache");
ここで、単にキャッシュ コンテキストを取得していることがわかりますが、ここでこの顧客を作成しています。有効期限を 10 分として別個に保存したいと言いました。これをコンテキスト内で永続化し、変更を保存してから、ここでキャッシュ挿入を実行しています。そして、この顧客をキャッシュに追加したことを印刷します。
それでは、コードを実行して、これがどのように機能するかを見てみましょう。完璧!したがって、顧客がキャッシュに追加されたことがわかります。これで閉じさせていただきます。実行された 1 に対するこの追加と、カウントの増加がわかります。それでは、統計に行きましょう。さあ、行きましょう!つまり、41 が表示され、カウントは 59 から 60 に減りました。
それでは、キャッシュ キーをエクスポートしてみましょう。完璧!それでは、行きましょう!キャッシュに追加された顧客が表示され、API がこのアイテムにキャッシュ キーを割り当てていることがわかります。追加するためにキーを指定する必要はありませんでした。それで完璧です!
さて、先に進みましょう。これをクリアして、キャッシュに入れたこの顧客を実際に削除しましょう。そこで、このコードをもう一度コメントアウトします。これをコメントアウトして、下にスクロールして、キャッシュ ハンドルを使用して顧客を削除しましょう。それで、ここにそのコードがあります。したがって、すべてを選択し、ここでコメントを解除するだけです。
//-------------------Remove Customer Using Cache Handle-------------------
...
Cache cache = context.GetCache();
Customer customerToRemove = context.Customers.Find("HANIH");
if (customerToRemove != null)
{
context.Customers.Remove(customerToRemove);
context.SaveChanges(true);
cache.Remove(customerToRemove);
Console.WriteLine($"\n\nCustomer ID: {customerToRemove.Customerid} -> Removed from Cache");
}
else
{
Console.WriteLine("\n\ncould not find the customer within the cache");
}
そして、このコードが行っていることは、コンテキストからキャッシュを再度取得し、コンテキスト内でその顧客を見つけていることです。そして、その顧客が実際に見つかった場合、その顧客をコンテキストから削除し、変更を保存し、次に、cache.Remove() を実行して顧客を削除し、顧客であることを出力します。そうしました。それ以外の場合、顧客が見つからなかった場合は、キャッシュ内で顧客が見つからなかったことを伝えるだけになります。
では、これを保存し、このアプリケーションを実行して、何が起こるかを見てみましょう。完璧!そこで、顧客を見つけてキャッシュから削除しました。素晴らしい!
ここで、これを閉じてカウントを見てみましょう。カウントが 60 から 59 に減少していることがわかります。統計からも、カウントが 60 から 59 に減少していることがわかります。次に、キャッシュ キーをエクスポートしましょう。これで 100 個のキーが表示されるはずです。完璧!したがって、以前にカウントに追加した顧客が 100 に戻っていることはわかりません。これで、このデモンストレーションはほぼ終了になります。ご覧いただきまして誠にありがとうございます。
さて、次のステップの一環として、ダウンロードしたい場合にできることは次のとおりです。 NCache, その後、30 日間の無料トライアルを利用して、完全に動作する製品を入手できます。にアクセスしてそれを行うことができます alachisoft.com ここにアクセスしてから、 ダウンロード ここからセクションを参照すると、.NET バージョンの要件に基づいてダウンロードできる製品が表示されます。
また、ご購読はいつでも停止することが可能です 試してみる NCache 遊び場 30分間。これにより、完全なサンドボックス セッションのようなものが得られ、コードを試したり、サンプルがどのように実行されるかを確認したり、製品全体の感触を得ることができます。
最後に、次のこともできます パーソナライズされたスケジュールを設定する NCache デモ ここで 1 時間分のダンプを提供します。 NCache 機能を使用 そしてそれがどれほどうまく機能するか。また、ユースケースの種類をお客様の問題点にマッピングし、お客様の環境でキャッシュがどの程度うまく機能するかを確認することもできます。それで、あなたはただ記入することができます このフォームはこちら そしてリクエストを送信します。必ずご確認いただけますので、それに応じてデモのスケジュールを設定いたします。
これでこのデモはほぼ終わりになります。ご覧いただきありがとうございます。素敵な一日を。さようなら。