第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 などの一部の属性は単一ファイルキャッシュストアに固有であり、他の種類のキャッシュストアには使用されません。
プログラムを使用したキャッシュストアの設定
-
ConfigurationBuilderを使用して、新規の設定オブジェクトを作成します。 -
passivation要素は Red Hat JBoss Data Grid がストアと通信する方法に影響を与えます。パッシベーションは、インメモリーキャッシュからオブジェクトを削除し、システムやデータベースなどの 2 次データストアに書き込みます。2 次データストアがない場合、オブジェクトはインメモリーキャッシュから削除されるのみです。パッシベーションはデフォルトでfalseです。 -
addSingleFileStore()要素は、この設定用のキャッシュストアとして SingleFileStore を追加します。addStoreメソッドを使用して追加できる、JDBC キャッシュストアなどの他のストアを作成することができます。 -
sharedパラメーターは、キャッシュストアが異なるキャッシュインスタンスによって共有されていることを示します。たとえば、クラスター内のすべてのインスタンスが、同じリモートの共有データベースと通信するために同じ JDBC 設定を使用する場合があります。sharedは、デフォルトでfalseになります。trueに設定すると、異なるキャッシュインスタンスによって重複データがキャッシュストアに書き込まれないようにすることができます。 -
preload要素はデフォルトではfalseに設定されます。trueに設定されると、キャッシュストアに保存されたデータは、キャッシュの起動時にメモリーにプリロードされます。これにより、キャッシュストアのデータが起動後すぐに利用できるようになり、データをレイジーにロードしたことによるキャッシュ操作の遅延を防ぐことができます。プリロードされたデータは、ノード上でローカルのみに保存され、プリロードされたデータのレプリケーションや分散は行われません。JBoss Data Grid は、エビクションのエントリーの最大設定数までの数をプリロードします。 -
fetchPersistentState要素は、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュストアでこのプロパティーがtrueに設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentStateプロパティーはデフォルトではfalseです。 -
purgeOnStartup要素は、キャッシュストアの起動時にキャッシュストアをパージするかどうかを制御し、デフォルトではfalseになります。 -
location設定要素は、ストアが書き込みできるディスクの場所を設定します。 -
これらの属性は、それぞれのキャッシュストアに固有の内容を設定します。たとえば、
location属性は、SingleFileStore がデータが含まれるファイルを維持する場所を指します。他のストアには、さらに複雑な設定が必要な場合があります。 -
singleton要素を使用すると、クラスター内の 1 つのノードのみで変更を保存できます。このノードはコーディネーターと呼ばれます。コーディネーターは、インメモリー状態のキャッシュをディスクにプッシュします。この機能は、すべてのノードのenabled属性をtrueに設定することによりアクティベートされます。sharedパラメーターは、singletonを同時に有効にした状態で定義することはできません。enabled属性はデフォルトではfalseです。 -
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 キャッシュストアのプログラムを使用した設定
-
ConfigurationBuilderを使用して、新規の設定オブジェクトを作成します。 -
LevelDBCacheStoreConfigurationBuilderクラスを使用してストアを追加し、その設定を構築します。 - LevelDB キャッシュストアのロケーションパスを設定します。指定したパスは、主なキャッシュストアデータを保存します。ディレクトリーがない場合は自動的に作成されます。
-
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 のプログラムを使用した設定 (ライブラリーモード)
-
ConfigurationBuilderを使用して、新規の設定オブジェクトを作成します。 -
JdbcBinaryStore設定ビルダーを追加して、このストアに関連する固有の設定を構築します。 -
fetchPersistentState要素は、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュローダーでこのプロパティーがtrueに設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentStateプロパティーはデフォルトではfalseです。 -
ignoreModifications要素は、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModificationsはデフォルトではfalseになります。 -
purgeOnStartup要素は、初回起動時にキャッシュがパージされるかどうかを指定します。 テーブルを以下のように設定します。
-
dropOnExitは、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトではfalseに設定されます。 -
createOnStartは、現在テーブルが存在しない場合にキャッシュストアの起動時にテーブルを作成します。このメソッドはデフォルトではtrueです。 -
tableNamePrefixは、データが保存されるテーブルの名前に接頭辞を設定します。 -
idColumnNameプロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。 -
dataColumnNameプロパティーは、キャッシュエントリーまたはバケットが保存される列を指定します。 -
timestampColumnName要素は、キャッシュエントリーまたはバケットのタイムスタンプが保存される列を指定します。
-
The
connectionPool要素は、次のパラメーターを使用して JDBC ドライバーの接続プールを指定します。-
connectionUrlパラメーターは、JDBC ドライバー固有の接続 URL を指定します。 -
usernameパラメーターには、connectionUrl経由で接続するために使用されるユーザー名が含まれます。 -
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 のプログラムを使用した設定
-
ConfigurationBuilderを使用して、新規の設定オブジェクトを作成します。 -
JdbcStringBasedStore設定ビルダーを追加して、このストアに関連する固有の設定を構築します。 -
fetchPersistentStateパラメーターは、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュローダーでこのプロパティーがtrueに設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentStateプロパティーはデフォルトではfalseです。 -
ignoreModificationsパラメーターは、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModificationsはデフォルトではfalseになります。 -
purgeOnStartupパラメーターは、初回起動時にキャッシュがパージされるかどうかを指定します。 テーブルの設定
-
dropOnExitは、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトではfalseに設定されます。 -
createOnStartは、現在テーブルが存在しない場合にキャッシュストアの起動時にテーブルを作成します。このメソッドはデフォルトではtrueです。 -
tableNamePrefixは、データが保存されるテーブルの名前に接頭辞を設定します。 -
idColumnNameプロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。 -
dataColumnNameプロパティーは、キャッシュエントリーまたはバケットが保存される列を指定します。 -
timestampColumnName要素は、キャッシュエントリーまたはバケットのタイムスタンプが保存される列を指定します。
-
dataSource要素は、以下のパラメーターを使用してデータソースを指定します。-
jndiUrlは、既存の JDBC への JNDI URL を指定します。
-
JdbcStringBasedStore 使用時に IO 例外である Unsupported protocol version 48 エラーが発生した場合、データ列タイプが適切な BLOB や VARBINARY ではなく、VARCHAR や CLOB などに設定されていることを示します。 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 のプログラムを使用した設定
-
ConfigurationBuilderを使用して、新規の設定オブジェクトを作成します。 -
JdbcMixedStore設定ビルダーを追加して、このストアに関連する固有の設定を構築します。 -
fetchPersistentStateパラメーターは、キャッシュの永続状態をフェッチするかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスするためフェッチ永続状態は無視されます。複数のキャッシュローダーでこのプロパティーがtrueに設定された場合にキャッシュサービスを起動すると、設定の例外が発生します。fetchPersistentStateプロパティーはデフォルトではfalseです。 -
ignoreModificationsパラメーターは、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModificationsはデフォルトではfalseになります。 -
purgeOnStartupパラメーターは、初回起動時にキャッシュがパージされるかどうかを指定します。 テーブルを以下のように設定します。
-
dropOnExitは、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトではfalseに設定されます。 -
createOnStartは、現在テーブルが存在しない場合にキャッシュストアの起動時にテーブルを作成します。このメソッドはデフォルトではtrueです。 -
tableNamePrefixは、データが保存されるテーブルの名前に接頭辞を設定します。 -
idColumnNameプロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。 -
dataColumnNameプロパティーは、キャッシュエントリーまたはバケットが保存される列を指定します。 -
timestampColumnName要素は、キャッシュエントリーまたはバケットのタイムスタンプが保存される列を指定します。
-
The
connectionPool要素は、次のパラメーターを使用して JDBC ドライバーの接続プールを指定します。-
connectionUrlパラメーターは、JDBC ドライバー固有の接続 URL を指定します。 -
usernameパラメーターには、connectionUrl経由で接続するために使用されるユーザー名が含まれます。 -
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();
Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.