第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();