第7章 永続性 SPI


7.1. 永続性 SPI

Red Hat JBoss Data Grid では、永続性によって外部 (永続) ストレージエンジンを設定できます。これらのストレージエンジンは Red Hat JBoss Data Grid のデフォルトのインメモリーストレージを補完します。

永続外部ストレージには以下のような利点があります。

  • メモリーは揮発性で、キャッシュストアによってキャッシュの情報の存続期間を延長することが可能です。これにより、持続性が向上します。
  • 永続外部ストアをアプリケーションとカスタムストレージエンジン間のキャッシングレイヤーとして使用すると、ライトスルー機能が向上します。
  • エビクションとパッシベーションの組み合わせを使用すると、頻繁に必要な情報のみがメモリー内に保存され、他のデータは外部ストレージに保存されます。
注記

Red Hat JBoss Data Grid のライブラリーモードでのみプログラムを使用して永続性を設定できます。

7.2. 永続性 SPI の利点

永続性 SPI の Red Hat JBoss Data Grid 実装には以下の利点があります。

  • JSR-107 (http://jcp.org/en/jsr/detail?id=107) とのアライメント。JBoss Data Grid の CacheWriter および CacheLoader インターフェースはJSR-107 ライターおよびリーダーと似ています。そのため、JSR-107 とのアライメントにより、JCache 対応ベンダー全体でストアの移植性が向上します。
  • 簡易化されたトランザクション統合。JBoss Data Grid はロックを自動的に処理するため、実装はストアへの同時アクセスを調整する必要はありません。ロックモードによっては同じキーで同時書き込みされないことがあります。しかし、インプリメンターはストアの操作が複数のスレッドから開始され、実装コードが追加されることを想定します。
  • シリアライズの減少により CPU の使用率が低下します。新しい SPI は保存されたエントリーをシリアライズされた形式で公開します。リモートで送信するためにエントリーが永続ストレージから取得された場合、デシリアライズ (ストアからの読み取り時) した後に再度シリアライズ (送信の書き込み時) する必要はありません。この代わりにエントリーはストレージから取得されるとシリアライズされた形式で書き込まれます。

7.3. 永続性 SPI のプログラムを使用した設定

以下は、永続性 SPI を使用した単一ファイルストアのプログラムを使用した設定の例になります。

永続性 SPI を使用した単一ファイルストアの設定

ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.persistence()
        .passivation(false)
        .addSingleFileStore()
            .preload(true)
            .shared(false)
            .fetchPersistentState(true)
            .ignoreModifications(false)
            .purgeOnStartup(false)
            .location(System.getProperty("java.io.tmpdir"))
            .async()
                .enabled(true)
                .threadPoolSize(5)
            .singleton()
                .enabled(true)
                .pushStateWhenCoordinator(true)
                .pushStateTimeout(20000);

7.4. 永続性の例

7.4.1. 永続性の例

以下は、プログラムを使用してキャッシュストア実装を設定する方法を示す例になります。これらのストアの比較と追加情報については『Administration and Configuration Guide』を参照してください。

7.4.2. プログラムを使用したキャッシュストアの設定

以下の例では、プログラムを使用してキャッシュストアを設定する方法を示します。

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence()
    .passivation(false)
    .addSingleFileStore()
        .shared(false)
        .preload(true)
        .fetchPersistentState(true)
        .purgeOnStartup(false)
        .location(System.getProperty("java.io.tmpdir"))
        .async()
           .enabled(true)
           .threadPoolSize(5)
        .singleton()
           .enabled(true)
           .pushStateWhenCoordinator(true)
           .pushStateTimeout(20000);
注記

この設定は単一ファイルキャッシュストア用です。location などの一部の属性は単一ファイルキャッシュストアに固有であり、他の種類のキャッシュストアには使用されません。

プログラムを使用したキャッシュストアの設定

  1. ConfigurationBuilder を使用して、新規の設定オブジェクトを作成します。
  2. passivation 要素は Red Hat JBoss Data Grid がストアと通信する方法に影響を与えます。パッシベーションは、インメモリーキャッシュからオブジェクトを削除し、システムやデータベースなどの 2 次データストアに書き込みます。2 次データストアがない場合、オブジェクトはインメモリーキャッシュから削除されるのみです。パッシベーションはデフォルトで false です。
  3. addSingleFileStore() 要素は、この設定用のキャッシュストアとして SingleFileStore を追加します。addStore メソッドを使用して追加できる、JDBC キャッシュストアなどの他のストアを作成することができます。
  4. shared パラメーターは、キャッシュストアが異なるキャッシュインスタンスによって共有されていることを示します。たとえば、クラスター内のすべてのインスタンスが、同じリモートの共有データベースと通信するために同じ JDBC 設定を使用する場合があります。shared は、デフォルトで false になります。true に設定すると、異なるキャッシュインスタンスによって重複データがキャッシュストアに書き込まれないようにすることができます。
  5. preload 要素はデフォルトでは false に設定されます。true に設定されると、キャッシュストアに保存されたデータは、キャッシュの起動時にメモリーにプリロードされます。これにより、キャッシュストアのデータが起動後すぐに利用できるようになり、データをレイジーにロードしたことによるキャッシュ操作の遅延を防ぐことができます。プリロードされたデータは、ノード上でローカルのみに保存され、プリロードされたデータのレプリケーションや分散は行われません。JBoss Data Grid は、エビクションのエントリーの最大設定数までの数をプリロードします。
  6. fetchPersistentState 要素は、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュストアでこのプロパティーが true に設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentState プロパティーはデフォルトでは false です。
  7. purgeOnStartup要素は、キャッシュストアの起動時にキャッシュストアをパージするかどうかを制御し、デフォルトでは false になります。
  8. location 設定要素は、ストアが書き込みできるディスクの場所を設定します。
  9. これらの属性は、それぞれのキャッシュストアに固有の内容を設定します。たとえば、location 属性は、SingleFileStore がデータが含まれるファイルを維持する場所を指します。他のストアには、さらに複雑な設定が必要な場合があります。
  10. singleton 要素を使用すると、クラスター内の 1 つのノードのみで変更を保存できます。このノードはコーディネーターと呼ばれます。コーディネーターは、インメモリー状態のキャッシュをディスクにプッシュします。この機能は、すべてのノードの enabled 属性を true に設定することによりアクティベートされます。shared パラメーターは、singleton を同時に有効にした状態で定義することはできません。enabled 属性はデフォルトでは false です。
  11. pushStateWhenCoordinator 要素はデフォルトでは true に設定されます。true の場合、このプロパティーにより、コーディネーターになったノードがインメモリー状態を基礎となるキャッシュストアに転送します。このパラメーターは、コーディネーターがクラッシュし、新規のコーディネーターが選択される場合に役に立ちます。

7.4.3. LevelDB キャッシュストアのプログラムを使用した設定

以下は、LevelDB キャッシュストアの、プログラムを使用した設定例です。

Configuration cacheConfig = new ConfigurationBuilder().persistence()
                .addStore(LevelDBStoreConfigurationBuilder.class)
                .location("/tmp/leveldb/data")
                .expiredLocation("/tmp/leveldb/expired").build();

LevelDB キャッシュストアのプログラムを使用した設定

  1. ConfigurationBuilder を使用して、新規の設定オブジェクトを作成します。
  2. LevelDBCacheStoreConfigurationBuilder クラスを使用してストアを追加し、その設定を構築します。
  3. LevelDB キャッシュストアのロケーションパスを設定します。指定したパスは、主なキャッシュストアデータを保存します。ディレクトリーがない場合は自動的に作成されます。
  4. LevelDB ストアの expiredLocation パラメーターを使用して、期限切れデータの場所を指定します。指定されたパスは、パージされる前に期限切れデータを保存します。ディレクトリーがない場合は自動的に作成されます。

7.4.4. JdbcBinaryStore のプログラムを用いた設定

JdbcBinaryStore は、同じテーブル行/blob の同じハッシュ値 (キー上の hashCode メソッド) ですべてのキーを格納し、すべてのキータイプをサポートします。

重要

バイナリー JDBC ストアは JBoss Data Grid 7.2 では非推奨となったため、実稼働での使用は推奨されません。代わりに String ベースのストアを使用することが推奨されます。

以下は、JdbcBinaryStore の設定例になります。

ConfigurationBuilder builder = new ConfigurationBuilder();
  builder.persistence()
     .addStore(JdbcBinaryStoreConfigurationBuilder.class)
     .fetchPersistentState(false)
     .ignoreModifications(false)
     .purgeOnStartup(false)
     .table()
        .dropOnExit(true)
        .createOnStart(true)
        .tableNamePrefix("ISPN_BUCKET_TABLE")
        .idColumnName("ID_COLUMN").idColumnType("VARCHAR(255)")
        .dataColumnName("DATA_COLUMN").dataColumnType("BINARY")
        .timestampColumnName("TIMESTAMP_COLUMN").timestampColumnType("BIGINT")
     .connectionPool()
        .connectionUrl("jdbc:h2:mem:infinispan_binary_based;DB_CLOSE_DELAY=-1")
        .username("sa")
        .driverClass("org.h2.Driver");

JdbcBinaryStore のプログラムを使用した設定 (ライブラリーモード)

  1. ConfigurationBuilder を使用して、新規の設定オブジェクトを作成します。
  2. JdbcBinaryStore 設定ビルダーを追加して、このストアに関連する固有の設定を構築します。
  3. fetchPersistentState 要素は、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュローダーでこのプロパティーが true に設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentState プロパティーはデフォルトでは false です。
  4. ignoreModifications 要素は、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModifications はデフォルトでは false になります。
  5. purgeOnStartup 要素は、初回起動時にキャッシュがパージされるかどうかを指定します。
  6. テーブルを以下のように設定します。

    1. dropOnExit は、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトでは false に設定されます。
    2. createOnStart は、現在テーブルが存在しない場合にキャッシュストアの起動時にテーブルを作成します。このメソッドはデフォルトでは true です。
    3. tableNamePrefix は、データが保存されるテーブルの名前に接頭辞を設定します。
    4. idColumnName プロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。
    5. dataColumnName プロパティーは、キャッシュエントリーまたはバケットが保存される列を指定します。
    6. timestampColumnName 要素は、キャッシュエントリーまたはバケットのタイムスタンプが保存される列を指定します。
  7. The connectionPool 要素は、次のパラメーターを使用して JDBC ドライバーの接続プールを指定します。

    1. connectionUrl パラメーターは、JDBC ドライバー固有の接続 URL を指定します。
    2. username パラメーターには、connectionUrl 経由で接続するために使用されるユーザー名が含まれます。
    3. driverClass パラメーターは、データベースへの接続に使用されるドライバーのクラス名を指定します。

7.4.5. JdbcStringBasedStore のプログラムを使用した設定

JdbcStringBasedStore は複数のエントリーを各行にグループ化せずに、各エントリーをテーブルの独自の行に格納するため、同時に負荷がかかる状態でスループットが増加します。

以下は、JdbcStringBasedStore の設定例になります。

ConfigurationBuilder builder = new ConfigurationBuilder();
  builder.persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class)
     .fetchPersistentState(false)
     .ignoreModifications(false)
     .purgeOnStartup(false)
     .table()
        .dropOnExit(true)
        .createOnStart(true)
        .tableNamePrefix("ISPN_STRING_TABLE")
        .idColumnName("ID_COLUMN").idColumnType("VARCHAR(255)")
        .dataColumnName("DATA_COLUMN").dataColumnType("BINARY")
        .timestampColumnName("TIMESTAMP_COLUMN").timestampColumnType("BIGINT")
     .dataSource()
        .jndiUrl("java:jboss/datasources/JdbcDS");

JdbcStringBasedStore のプログラムを使用した設定

  1. ConfigurationBuilder を使用して、新規の設定オブジェクトを作成します。
  2. JdbcStringBasedStore 設定ビルダーを追加して、このストアに関連する固有の設定を構築します。
  3. fetchPersistentState パラメーターは、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュローダーでこのプロパティーが true に設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentState プロパティーはデフォルトでは false です。
  4. ignoreModifications パラメーターは、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModifications はデフォルトでは false になります。
  5. purgeOnStartup パラメーターは、初回起動時にキャッシュがパージされるかどうかを指定します。
  6. テーブルの設定

    1. dropOnExit は、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトでは false に設定されます。
    2. createOnStart は、現在テーブルが存在しない場合にキャッシュストアの起動時にテーブルを作成します。このメソッドはデフォルトでは true です。
    3. tableNamePrefix は、データが保存されるテーブルの名前に接頭辞を設定します。
    4. idColumnName プロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。
    5. dataColumnName プロパティーは、キャッシュエントリーまたはバケットが保存される列を指定します。
    6. timestampColumnName 要素は、キャッシュエントリーまたはバケットのタイムスタンプが保存される列を指定します。
  7. dataSource 要素は、以下のパラメーターを使用してデータソースを指定します。

    • jndiUrl は、既存の JDBC への JNDI URL を指定します。
注記

JdbcStringBasedStore 使用時に IO 例外である Unsupported protocol version 48 エラーが発生した場合、データ列タイプが適切な BLOBVARBINARY ではなく、VARCHARCLOB などに設定されていることを示します。 JdbcStringBasedStore の値はどのデータタイプでもよく、キーが文字列であることのみ必要となります。そのため、バイナリー列に保存することができます。

7.4.6. JdbcMixedStore のプログラムを使用した設定

JdbcMixedStore は、キーのタイプを基にキーを JdbcBinaryStore または JdbcStringBasedStore に委譲するハイブリッド実装です。

重要

混合 JDBC ストアは JBoss Data Grid 7.2 では非推奨となったため、実稼働での使用は推奨されません。代わりに String ベースのストアを使用することが推奨されます。

以下は、JdbcMixedStore の設定例になります。

ConfigurationBuilder builder = new ConfigurationBuilder();
  builder.persistence().addStore(JdbcMixedStoreConfigurationBuilder.class)
     .fetchPersistentState(false)
     .ignoreModifications(false)
     .purgeOnStartup(false)
     .stringTable()
        .dropOnExit(true)
        .createOnStart(true)
        .tableNamePrefix("ISPN_MIXED_STR_TABLE")
        .idColumnName("ID_COLUMN").idColumnType("VARCHAR(255)")
        .dataColumnName("DATA_COLUMN").dataColumnType("BINARY")
        .timestampColumnName("TIMESTAMP_COLUMN").timestampColumnType("BIGINT")
     .binaryTable()
        .dropOnExit(true)
        .createOnStart(true)
        .tableNamePrefix("ISPN_MIXED_BINARY_TABLE")
        .idColumnName("ID_COLUMN").idColumnType("VARCHAR(255)")
        .dataColumnName("DATA_COLUMN").dataColumnType("BINARY")
        .timestampColumnName("TIMESTAMP_COLUMN").timestampColumnType("BIGINT")
     .connectionPool()
        .connectionUrl("jdbc:h2:mem:infinispan_binary_based;DB_CLOSE_DELAY=-1")
        .username("sa")
        .driverClass("org.h2.Driver");

JdbcMixedStore のプログラムを使用した設定

  1. ConfigurationBuilder を使用して、新規の設定オブジェクトを作成します。
  2. JdbcMixedStore 設定ビルダーを追加して、このストアに関連する固有の設定を構築します。
  3. fetchPersistentState パラメーターは、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュローダーでこのプロパティーが true に設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentState プロパティーはデフォルトでは false です。
  4. ignoreModifications パラメーターは、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModifications はデフォルトでは false になります。
  5. purgeOnStartup パラメーターは、初回起動時にキャッシュがパージされるかどうかを指定します。
  6. テーブルを以下のように設定します。

    1. dropOnExit は、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトでは false に設定されます。
    2. createOnStart は、現在テーブルが存在しない場合にキャッシュストアの起動時にテーブルを作成します。このメソッドはデフォルトでは true です。
    3. tableNamePrefix は、データが保存されるテーブルの名前に接頭辞を設定します。
    4. idColumnName プロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。
    5. dataColumnName プロパティーは、キャッシュエントリーまたはバケットが保存される列を指定します。
    6. timestampColumnName 要素は、キャッシュエントリーまたはバケットのタイムスタンプが保存される列を指定します。
  7. The connectionPool 要素は、次のパラメーターを使用して JDBC ドライバーの接続プールを指定します。

    1. connectionUrl パラメーターは、JDBC ドライバー固有の接続 URL を指定します。
    2. username パラメーターには、connectionUrl 経由で接続するために使用されるユーザー名が含まれます。
    3. driverClass パラメーターは、データベースへの接続に使用されるドライバーのクラス名を指定します。

7.4.7. JPA キャッシュストアのプログラムを使用した設定例

Red Hat JBoss Data Grid で JPA キャッシュストアをプログラムを使用して設定するには、以下を使用します。

Configuration cacheConfig = new ConfigurationBuilder().persistence()
        .addStore(JpaStoreConfigurationBuilder.class)
        .persistenceUnitName("org.infinispan.loaders.jpa.configurationTest")
        .entityClass(User.class)
    .build();

このコード例で使用されるパラメーターは以下のとおりです。

  • persistenceUnitName パラメーターは、JPA エンティティークラスが含まれる設定ファイル (persistence.xml ) の JPA キャッシュストアの名前を指定します。
  • entityClass パラメーターは、このキャッシュに格納された JPA エンティティークラスを指定します。設定ごとに 1 つのクラスのみを指定できます。

7.4.8. Cassandra キャッシュストアのプログラムを使用した設定例

Cassandra キャッシュストアは、Red Hat JBoss Data Grid のコアライブラリーの一部ではなく、クラスパスに追加する必要があります。Maven プロジェクトでは、以下を pom.xml に追加するとクラスパスに追加できます。

<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-cachestore-cassandra</artifactId>
    <version>...</version> <!-- 7.2.0 or later -->
</dependency>

以下の設定スニペットは、プログラムを使用して Cassandra キャッシュストアを定義する方法の例を示しています。

Configuration cacheConfig = new ConfigurationBuilder()
    .persistence()
    .addStore(CassandraStoreConfigurationBuilder.class)
    .addServer()
        .host("127.0.0.1")
        .port(9042)
    .addServer()
        .host("127.0.0.1")
        .port(9041)
    .autoCreateKeyspace(true)
    .keyspace("TestKeyspace")
    .entryTable("TestEntryTable")
    .consistencyLevel(ConsistencyLevel.LOCAL_ONE)
    .serialConsistencyLevel(ConsistencyLevel.SERIAL)
    .connectionPool()
        .heartbeatIntervalSeconds(30)
        .idleTimeoutSeconds(120)
        .poolTimeoutMillis(5)
    .build();
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.