使い方 NCache Hibernate L2 キャッシュとして

みなさん、こんにちは。私の名前はスレイマンです。このビデオでは、どのように使用できるかを見ていきます。 NCache Javaアプリケーション用のHibernateレベル2キャッシュとして使用できます。

NCache アーキテクチャ

これは通常 NCache エンタープライズ環境にデプロイされています。その上にアプリケーション層があり、そこでクライアントアプリケーションが実行されます。これはキャッシュクライアントとも呼ばれます。次に、キャッシュサーバーで構成される別のキャッシュ層があり、最後にその下にデータベース層があります。さて、私のセットアップは、こちらの構造と非常によく似ています。

NCache エンタープライズ環境での展開
NCache エンタープライズ環境での展開

使い方 NCache Hibernateで

これは通常、Hibernate がこのように構成されます。Hibernate がデフォルトでセットアップされている場合、常にレベル 1 キャッシュが使用されます。これから行うのは、セットアップにレベル 2 キャッシュをプラグインし、それを使用することです。 NCacheまた、オプションとして、Hibernateクエリの結果を保存するために使用されるクエリキャッシュを追加することもできます。このビデオでは、それについても説明します。

使い方 NCache Hibernateで
使い方 NCache Hibernateで

レベル2キャッシュの利点

それでは、レベル2キャッシュの利点についても説明します。レベル1キャッシュは単一のセッションにしか保持されません。そのため、新しいセッションを開くと、レベル1キャッシュのデータは失われます。レベル2キャッシュの利点は、キャッシュデータが複数のHibernateセッション間で共有されることです。これが、私たちがここで実現しようとしていることです。

セットアップ統合

それでは、実際にプロジェクトの設定を見てみましょう。ご覧のとおり、これはシンプルなコンソールアプリケーションです。Hibernateの設定があり、顧客、注文、製品、サプライヤーというエンティティを追加しています。これらのエンティティをHibernateの設定に追加し、セッションファクトリを作成してセッションを開きます。その後、メニューがポップアップ表示されるので、そこからオプションを選択できます。オブジェクトを追加したり、オブジェクトを取得したり、新しいセッションを開いたりできます。

用途

それでは、これらの操作すべてを試してみましょう。これが私の現在のHibernate設定ファイルです。ご覧のとおり、レベル2キャッシュは設定しておらず、基本的なオプションのみを使用しています。

Hibernate設定ファイル
  • ステップ1: 追加 NCache HibernateのMaven依存関係
  • ステップ2: キャッシュ領域を設定する ncache-hibernate.xml
  • ステップ3: Hibernateプロパティの設定 hibernate.cfg.xml
  • ステップ4: キャッシュ可能なオブジェクトを指定する
    • Hibernate/JPA アノテーション
    • XMLマッピングファイル

追加 NCache HibernateのMaven依存関係

それでは、セットアップに移りましょう。まず最初に、 NCache Hibernate Maven の依存関係。この依存関係がどこにあるかを知りたい場合は、 NCache ウェブサイト。開発者向け Java 統合セクションに移動します。そして、これは私を次の場所に誘導します。 Maven 中央リポジトリ 最新のアーティファクトIDとバージョンがわかります。ご覧のとおり、キャッシュHibernate 5.3.6です。それで、これをコピーして pom.xml ファイルにソフトウェアを指定する必要があります。

<dependency>
    <groupId>com.alachisoft.ncache</groupId>
    <artifactId>ncache-hibernate</artifactId>
    <version>5.3.6</version>
</dependency>

Mavenの変更を再読み込みして同期しましょう。ライブラリを再確認してください。 NCache クライアント、 NCache Hibernateとキャッシュランタイムがロードされました。完璧です。

ncache-hibernate.xmlでキャッシュ領域を設定します。

次のステップは、ncache-hibernate.xml ファイルでキャッシュ領域を設定することです。ここでは、キャッシュ領域、キャッシュサーバー、および設定オプションを指定します。このファイルは resources ディレクトリに作成します。

このファイルの XML レイアウトについては、 NCache セットアップに関する優れたガイドが掲載されているウェブサイトがあります。ドキュメントセクションに移動して、プログラマーズガイドを開き、Hibernateとの統合を探します。このセクションにあると思いますので、XMLマッピングファイルを使用して設定する方法を説明します。エンティティに注釈を付ける方法も説明します。そして、その下にキャッシュ領域の設定があります。これをXMLファイルにコピーします。

<configuration>
  <application-config application-id="myapp" enable-cache-exception="true" default-region-name="DefaultRegion" key-case-sensitivity="false">
    <cache-regions>
      <region name="default" cache-name="demoCache" priority="default" expiration-type="None" expiration-period="0"/>
    </cache-regions>
  </application-config>
</configuration>

現時点ではデータベース依存関係タグは不要なので削除します。しかし、ここには複数のリージョンが設定されていることがわかります。Hibernate ではそれが可能です。ここでは 1 つのリージョンのみを使用しますが、その目的は、これを default と名付けます。複数のリージョンの目的は、Hibernate エンティティを異なるリージョンに関連付け、異なるリージョンを異なるキャッシュ サーバーに関連付けることです。つまり、最終的にはまったく別のキャッシュにエンティティが保存されることになります。ここには、アイテムの優先度レベルや有効期限タイプなどのオプションがあります。有効期限タイプは現在 none に設定されていますが、もちろんこれも構成できます。

hibernate.cfg.xmlでHibernateのプロパティを設定します。

わかりました。では、このままにして、次のステップに進みましょう。次のステップは、Hibernate 設定ファイルで Hibernate プロパティを設定することです。先ほども述べましたが、現時点ではレベル 2 のキャッシュは設定されていません。4 つのプロパティをここにコピーする必要があります。EndCache Web サイトに戻り、アプリケーションの設定に進むと、これらのプロパティが表示されます。これをプロジェクトにコピーします。

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.region.factory_class">com.alachisoft.ncache.NCacheRegionFactory</property>
    <property name="ncache.application_id">myapp</property>
    <property name="hibernate.cache.use_query_cache">true</property>
  </session-factory>
</hibernate-configuration>

ご覧のとおり、2 次レベルのキャッシュを使用しており、それを true に設定しています。 NCache リージョンファクトリをリージョンファクトリクラスとして定義します。これはレベル2キャッシュの設定にとって重要です。これがすべてであることがわかります。 NCache コードはこちらです。ここではアプリケーションIDを設定します。この場合は「myapp」です。このアプリケーションIDは、こちらのXMLファイルにあるアプリケーション設定と一致している必要があります。最後に、クエリキャッシュを使用するタグを有効にします。今のところはtrueのままにしておきますが、現時点ではクエリキャッシュは有効になっていません。有効にするにはもう1つ手順が必要です。それについては、ビデオの後半で説明します。

NCache 管理センター

さて、次に進む前に、私たちの NCache 管理センターです。ご覧のとおり、demoCache という名前のキャッシュが既に設定されています。単一のサーバーノードを使用していますが、もちろん、ご自身の環境では複数のサーバーを使用できます。これから統計情報を確認し、データがないことを確認してみます。完璧です。空の状態から始めます。

NCache 管理センター
NCache 管理センター

キャッシュ可能なオブジェクトを指定する

  • Hibernate/JPA アノテーション
  • XMLマッピングファイル

この最後のステップは、キャッシュ可能なオブジェクトを指定することです。これはアノテーションを使用するか、XMLマッピングファイルで指定できます。しかし、ここでは簡単に、どのエンティティのキ​​ャッシュを有効にするかをHibernateに知らせるだけです。

Hibernate / JPA アノテーション

それでは、アノテーションについてはエンティティクラスに入ります。ご覧のとおり、JPAは既に設定済みです。このエンティティテーブルはJakartaパーシステンスの一部です。ここにキャッシュアノテーションを追加します。これはスライドでもお見せします。このキャッシュアノテーションを追加するだけで、キャッシュ同時実行戦略とリージョンも指定しました。これが書き留めておくべき内容です。

@Entity
@Table(name = "Products")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region = "default")
public class Product implements Serializable {}

@Id
@Column(name = "ProductID")
Private Long productid;

これはHibernateのアノテーションで、キャッシュの同時実行戦略を渡します。私の場合は、非厳密な読み書きを使用します。また、領域をデフォルトに設定します。この同時実行戦略は、データベーストランザクションとキャッシュ間の一貫性を確保するためのものです。非厳密とは、トランザクションの直後にこの一貫性を確保する必要がないことを意味します。これはデータベースロックを防ぐ安全なオプションです。もちろん、ここには複数の異なるオプションがあります。厳密な読み書き、トランザクション読み取り専用などです。とりあえず、今回はこのオプションを使用します。

これをコピーして、他のエンティティにも貼り付けます。よし、完璧だ。これでエンティティへの注釈付けは完了です。

XML マッピング

これを XML で行いたい場合、ソース コードを変更したくない場合は、XML でこれらを指定してまったく同じ動作を実現することもできます。各エンティティごとに個別の XML ファイルを定義し、それらにこれらの XML タグを追加する必要があります。では、それがどのようなものか簡単に説明します。たとえば、注文の場合は、order.hbm.xml を定義し、ここに XML レイアウトを貼り付けます。では、次に、 NCache ウェブサイトです。ここにXMLの設定があると思うので。そして、これがその例です。つまり、これは既に注文オブジェクトを利用しています。これをそのままコピーします。

<hibernate-mapping package="com.alachisoft.ncache.sample">
    <class name="Orders" table="Orders">
        <cache usage="nonstrict-read-write" region="OrderRegion"/>
        <id name="orderID" type="int">
            <column name="OrderID"/>
            <generator class="assigned"/>
        </id>
        <property name="orderDate" type="date">
            <column name="OrderDate"/>
        </property>
        <property name="shippedDate" type="date">
            <column name="ShippedDate"/>
        </property>
        <property name="shipAddress" type="string">
            <column name="ShipAddress"/>
        </property>
        <property name="shipCountry" type="string">
            <column name="ShipCountry"/>
        </property>
    </class>
</hibernate-mapping>

ここでわかるように、クラス名、同時実行戦略オプション、リージョン、カラムなどを受け取ります。以前と同じように行いますが、XML形式です。繰り返しますが、これは各エンティティに対して行う必要があります。最後に、Hibernateの設定ファイル内でマッピングリソースを宣言する必要があります。つまり、この特定の行、マッピングリソースも宣言する必要があります。

<mapping resource="order.hbm.xml"/>

念のため、どんな感じか確認してみます。はい、order.hbm.xml ですね。繰り返しますが、各エンティティ ファイルに対しても同じ操作を行う必要があります。今回は注釈のみを使用するので、このファイルは一旦削除してコメントアウトしておきます。

これでほぼ準備は完了です。アプリケーションを起動する前に、データベースをお見せしましょう。すべてのテーブルに既存のデータが格納されています。これからこのデータを使っていろいろと試してみます。では、ここでアプリケーションを起動してみましょう。

読み込み中に、 NCache 統計情報を並べて表示します。これにより、操作をリアルタイムで確認できます。ご覧のとおり、クライアント アプリケーションが接続され、メニューの準備が整いました。まず、データベースからすべての製品を読み込み、キャッシュに保存します。キャッシュに保存するとは、レベル 1 キャッシュとレベル 2 キャッシュの両方に保存されることを意味します。ここで 3 をクリックすると、32 個のオブジェクトが返され、キャッシュの数も 32 増加していることがわかります。

NCache 統計

同じ方法で再度商品を取得する場合、データベースではなくキャッシュから取得することを期待します。そこで、そのように実行します。すべての商品を取得できましたが、重要なのは、このデータがレベル2キャッシュではなくレベル1キャッシュから取得されたということです。

レベル2キャッシュから取得したい場合は、新しいセッションを開いて、まったく同じことを行います。ここで7をクリックすると、コードでもその様子をお見せします。ここにケース番号7があります。現在のセッションを閉じ、新しいセッションを開きます。これがこれから行うことです。

L2キャッシュからデータを取得する

これでレベル1キャッシュのデータはクリアされるはずです。しかし、レベル2キャッシュにはまだすべてのデータが残っていることに気づくでしょう。新しいセッションで全ての製品を取得する場合、レベル2キャッシュから取得されるはずです。ご覧のとおり、1秒あたりのリクエスト数がトリガーされたため、レベル2キャッシュからデータが取得されました。これでその点は解決しました。

クエリキャッシュを有効にする

  1. このプロパティをhibernate.cfg.xmlで宣言してください。

    <property name="hibernate.cache.use_query_cache">true</property>
  2. クエリを作成する際に、setCacheable(true)関数を呼び出してください(Javaの場合)。

    products = session.createQuery(query)
                    .setCacheable(true)
                    .getResultList();

次に、もう一つ説明したいことがあります。それはクエリキャッシュの使用です。クエリキャッシュの利点は、Hibernateクエリの結果を保存して、次のリクエスト時の検索を高速化できることです。このプロパティは既に宣言されているので、Javaコード内で`.set cacheable`メソッドをtrueに設定するだけです。設定ファイルをもう一度確認すると、クエリキャッシュがtrueに設定されていることがわかります。Javaコードに1行追加するだけで済みます。クエリキャッシュは、もちろん、`get available products`などのget操作で使用されます。ここで、セッションオブジェクト内でクエリを作成します。これはHibernateセッションです。次に、`.set cacheable`メソッドを呼び出します。 .setCacheable(true) こちらです。これでクエリキャッシュが有効になるはずです。

だから、私はこれを私のすべての getOperations(), getSuppliers() これもそうです。完璧です。これでクエリ キャッシュが有効になりました。アプリケーションを起動する前に、再起動したいと思います。キャッシュの内容をクリアして、最初からやり直したいのです。管理センターで、デモ キャッシュの内容をクリアをクリックします。完璧です。統計をクリックすると、カウントがゼロに戻っていることがわかります。それでは、アプリケーションを起動しましょう。

アプリケーションは正常に動作しているようで、クライアントも接続されました。まずは、当然ながらすべての製品を取得します。キャッシュからデータを削除したので、データベースから読み込みます。オプション3「すべての製品を取得」を選択します。予想通り、すべての製品を取得できました。32個のオブジェクトがあり、これもキャッシュに読み込まれています。

クエリキャッシュが有効になった後のデータ取得

キャッシュのカウントが 32 ではなく 33 になっていることに気づくでしょう。追加された項目は Hibernate クエリです。これもキャッシュされました。SQL では、当然ながら、これは「select all from products table」のようになります。すべての製品を再度取得すると、ここでわかるように、今回はキャッシュからデータが取得されることを期待しています。ここで、1 秒あたりのリクエストがトリガーされたことがわかります。Hibernate クエリを使用してキャッシュからデータを取得しました。もう 1 つは、ID で顧客を取得することです。オプション番号 4 をクリックしましょう。顧客 ID を求められているので、例としてランダムな ID を検索してみましょう。BLAUS を使用します。これで、顧客 ID を取得し、その結果をキャッシュし、Hibernate クエリをキャッシュすることを期待しています。ここで、顧客がフェッチされ、顧客データが Hibernate クエリとともに保存されたことがわかります。すべてが期待どおりに動作しています。

デモを予約

これでデモンストレーションは終了です。さらに詳しく知りたい場合は、 NCache、 その 建築, 機能を使用、またそれをアプリケーションにどのように組み込むことができるかについては、当社までお問い合わせください。 デモを予約するこの動画をご覧いただき、誠にありがとうございました。

次はどうする?

お問い合わせ

電話

+1 214-619-2601 (米国)

+44 20 7993 8327 (英国)

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