18.6. JDBC ベースのキャッシュストア
Red Hat JBoss Data Grid は、一般的なデータストレージ形式と共に使用される複数のキャッシュストアを提供します。JDBC ベースのキャッシュストアは、JDBC ドライバーを公開するキャッシュストアと共に使用されます。JBoss Data Grid は、永続化されるキーに応じて以下の JDBC ベースのキャッシュストアを提供します。
JdbcBinaryStore
。JdbcStringBasedStore
。JdbcMixedStore
。
18.6.1. JdbcBinaryStores
JdbcBinaryStore
はすべてのキータイプをサポートします。同じテーブル行/Blob の同じハッシュ値 (キー上の hashCode
メソッド) を持つすべてのキーを格納します。組み込まれるキーに共通するハッシュ値が、テーブルの行/Blob の主キーとして設定されます。このハッシュ値により、JdbcBinaryStore
は大変優れた柔軟性を提供しますが、これにより平行性とスループットのレベルが下がります。
たとえば、3 つのキー (
k1
、k2
、k3
) のハッシュコードが同じである場合、同じテーブル行に格納されます。3 つの異なるスレッドが k1
、k2
、k3
を同時に更新しようとすると、すべてのキーが同じ行を共有するため同時には更新できないことから、順次更新する必要があります。
18.6.1.1. JdbcBinaryStore の設定 (リモートクライアントサーバーモード)
以下は、Red Hat JBoss Data Grid のリモートクライアントサーバーモードを使用し、パッシベーションを有効にした
JdbcBinaryStore
の設定です。
<local-cache name="customCache"> <!-- Additional configuration elements here --> <binary-keyed-jdbc-store datasource="java:jboss/datasources/JdbcDS" passivation="${true/false}" preload="${true/false}" purge="${true/false}"> <binary-keyed-table prefix="JDG"> <id-column name="id" type="${id.column.type}"/> <data-column name="datum" type="${data.column.type}"/> <timestamp-column name="version" type="${timestamp.column.type}"/> </binary-keyed-table> </binary-keyed-jdbc-store> </local-cache>
この設定例で使用された要素とパラメーターの詳細については、「キャッシュストア設定の詳細 (リモートクライアントサーバーモード)」を参照してください。
18.6.1.2. JdbcBinaryStore の設定 (ライブラリーモード)
以下は、
JdbcBinaryStore
の設定例です。
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd urn:infinispan:config:jdbc:6.0 http://www.infinispan.org/schemas/infinispan-cachestore-jdbc-config-6.0.xsd" xmlns="urn:infinispan:config:6.0"> <!-- Additional configuration elements here --> <persistence> <binaryKeyedJdbcStore xmlns="urn:infinispan:config:jdbc:6.0" fetchPersistentState="false" ignoreModifications="false" purgeOnStartup="false"> <connectionPool connectionUrl="jdbc:h2:mem:infinispan_binary_based;DB_CLOSE_DELAY=-1" username="sa" driverClass="org.h2.Driver"/> <binaryKeyedTable dropOnExit="true" createOnStart="true" prefix="ISPN_BUCKET_TABLE"> <idColumn name="ID_COLUMN" type="VARCHAR(255)" /> <dataColumn name="DATA_COLUMN" type="BINARY" /> <timestampColumn name="TIMESTAMP_COLUMN" type="BIGINT" /> </binaryKeyedTable> </binaryKeyedJdbcStore> </persistence>
この設定例で使用された要素とパラメーターの詳細については、「キャッシュストア設定の詳細 (ライブラリモード)」を参照してください。
18.6.1.3. JdbcBinaryStore のプログラムを用いた設定
以下は、
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");
手順18.4 JdbcBinaryStore のプログラムを用いた設定 (ライブラリーモード)
ConfigurationBuilder
を使用して、新規の設定オブジェクトを作成します。- このストアに関連する特定の設定を構築するには、
JdbcBinaryStore
設定ビルダーを追加します。 fetchPersistentState
要素は、キャッシュの永続ステートを取り込むかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスする際に、fetch persistent 状態は無視されます。複数のキャッシュローダーでこのプロパティーがtrue
に設定されている場合にキャッシュサービスを起動すると、設定の例外がスローされます。fetchPersistentState
プロパティーはデフォルトではfalse
です。ignoreModifications
要素は、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModifications
はデフォルトではfalse
になります。purgeOnStartup
要素は、初回起動時にキャッシュがパージされるかどうかを指定します。- テーブルを以下のように設定します。
dropOnExit
は、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトではfalse
に設定されます。createOnStart
は、現在テーブルが存在しない場合にキャッシュストアを起動すると、テーブルを作成します。このメソッドはデフォルトではtrue
です。tableNamePrefix
は、データが保存されるテーブルの名前にプレフィックスを設定します。idColumnName
プロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。dataColumnName
プロパティーは、キャッシュエントリーまたはバケット ID が保存される列を指定します。timestampColumnName
要素は、キャッシュエントリーのタイムスタンプまたはバケットが保存される列を指定します。
connectionPool
要素は、次のパラメーターを使用して JDBC ドライバーの接続プールを指定します。connectionUrl
パラメーターは、JDBC ドライバー固有の接続 URL を指定します。username
パラメーターには、connectionUrl
経由で接続するために使用されるユーザー名が含まれます。driverClass
パラメーターは、データベースに接続するために使用されるドライバーのクラス名を指定します。
注記
プログラムを使用した設定は、Red Hat JBoss Data Grid ライブラリーモードのみで利用できます。
18.6.2. JdbcStringBasedStores
JdbcStringBasedStore
は複数のエントリーを各行にグループ化せずに、各エントリーをテーブルの独自の行に格納するため、同時負荷の下でスループットが増加します。また、各キーを String
オブジェクトへマッピングする (プラグ可能な) バイジェクション (bijection) も使用します。Key2StringMapper
インターフェースはバイジェクションを定義します。
Red Hat JBoss Data Grid には、プリミティブタイプを処理する
DefaultTwoWayKey2StringMapper
と呼ばれるデフォルトの実装が含まれています。
18.6.2.1. JdbcStringBasedStore の設定 (リモートクライアントサーバーモード)
以下は、Red Hat JBoss Data Grid のリモートクライアントサーバーモードの
JdbcStringBasedStore
の設定例です。
<local-cache name="customCache"> <!-- Additional configuration elements here --> <string-keyed-jdbc-store datasource="java:jboss/datasources/JdbcDS" passivation="true" preload="false" purge="false" shared="false" singleton="true"> <string-keyed-table prefix="JDG"> <id-column name="id" type="${id.column.type}"/> <data-column name="datum" type="${data.column.type}"/> <timestamp-column name="version" type="${timestamp.column.type}"/> </string-keyed-table> </string-keyed-jdbc-store> </local-cache>
この設定例で使用された要素とパラメーターの詳細については、「キャッシュストア設定の詳細 (リモートクライアントサーバーモード)」を参照してください。
18.6.2.2. JdbcStringBasedStore 設定 (ライブラリーモード)
JdbcStringBasedStore
の設定例は次のとおりです。
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd urn:infinispan:config:jdbc:6.0 http://www.infinispan.org/schemas/infinispan-cachestore-jdbc-config-6.0.xsd" xmlns="urn:infinispan:config:6.0"> <!-- Additional configuration elements here --> <persistence> <stringKeyedJdbcStore xmlns="urn:infinispan:config:jdbc:6.0" fetchPersistentState="false" ignoreModifications="false" purgeOnStartup="false" key2StringMapper="org.infinispan.loaders.keymappers.DefaultTwoWayKey2StringMapper"> <connectionPool connectionUrl="jdbc:h2:mem:infinispan_binary_based;DB_CLOSE_DELAY=-1" username="sa" driverClass="org.h2.Driver"/> <stringKeyedTable dropOnExit="true" createOnStart="true" prefix="ISPN_STRING_TABLE"> <idColumn name="ID_COLUMN" type="VARCHAR(255)" /> <dataColumn name="DATA_COLUMN" type="BINARY" /> <timestampColumn name="TIMESTAMP_COLUMN" type="BIGINT" /> </stringKeyedTable> </stringKeyedJdbcStore> </persistence>
この設定例で使用された要素とパラメーターの詳細については、「キャッシュストア設定の詳細 (ライブラリモード)」を参照してください。
18.6.2.3. JdbcStringBasedStore の複数ノード設定 (リモートクライアントサーバーモード)
以下は、Red Hat JBoss Data Grid のリモートクライアントサーバーモードにおける
JdbcStringBasedStore
の設定になります。この設定は、複数のノードを使用しなければならない場合に使用されます。
<subsystem xmlns="urn:infinispan:server:core:6.1" default-cache-container="default"> <cache-container <!-- Additional configuration information here --> > <!-- Additional configuration elements here --> <replicated-cache> <!-- Additional configuration elements here --> <string-keyed-jdbc-store datasource="java:jboss/datasources/JdbcDS" fetch-state="true" passivation="false" preload="false" purge="false" shared="false" singleton="true"> <string-keyed-table prefix="JDG"> <id-column name="id" type="${id.column.type}"/> <data-column name="datum" type="${data.column.type}"/> <timestamp-column name="version" type="${timestamp.column.type}"/> </string-keyed-table> </string-keyed-jdbc-store> </replicated-cache> </cache-container> </subsystem>
この設定例で使用された要素とパラメーターの詳細については、「キャッシュストア設定の詳細 (リモートクライアントサーバーモード)」を参照してください。
18.6.2.4. 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") .connectionPool() .connectionUrl("jdbc:h2:mem:infinispan_binary_based;DB_CLOSE_DELAY=-1") .username("sa") .driverClass("org.h2.Driver");
手順18.5 プログラムを使用した JdbcStringBasedStore の設定
ConfigurationBuilder
を使用して、新規の設定オブジェクトを作成します。- このストアに関連する特定の設定を構築するには
JdbcStringBasedStore
設定ビルダーを追加します。 fetchPersistentState
パラメーターは、キャッシュの永続ステートを取り込むかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスする際に、fetch persistent 状態は無視されます。複数のキャッシュローダーでこのプロパティーがtrue
に設定されている場合にキャッシュサービスを起動すると、設定の例外がスローされます。fetchPersistentState
プロパティーはデフォルトではfalse
です。ignoreModifications
パラメーターは、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModifications
はデフォルトではfalse
です。purgeOnStartup
パラメーターは、初回起動時にキャッシュがパージされるかどうかを指定します。- テーブルを以下のように設定します。
dropOnExit
は、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトではfalse
に設定されます。createOnStart
は、現在テーブルが存在しない場合にキャッシュストアを起動すると、テーブルを作成します。このメソッドはデフォルトではtrue
です。tableNamePrefix
は、データが保存されるテーブルの名前にプレフィックスを設定します。idColumnName
プロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。dataColumnName
プロパティーは、キャッシュエントリーまたはバケット ID が保存される列を指定します。timestampColumnName
要素は、キャッシュエントリーのタイムスタンプまたはバケットが保存される列を指定します。
connectionPool
要素は、次のパラメーターを使用して JDBC ドライバーの接続プールを指定します。connectionUrl
パラメーターは、JDBC ドライバー固有の接続 URL を指定します。username
パラメーターには、connectionUrl
経由で接続するために使用されるユーザー名が含まれます。driverClass
パラメーターは、データベースに接続するために使用されるドライバーのクラス名を指定します。
注記
プログラムを使用した設定は、Red Hat JBoss Data Grid ライブラリーモードのみで利用できます。
18.6.3. JdbcMixedStores
JdbcMixedStore
は、キーのタイプを基にキーを JdbcBinaryStore
または JdbcStringBasedStore
に委譲するハイブリッド実装です。
18.6.3.1. JdbcMixedStore の設定 (リモートクライアントサーバーモード)
以下は、Red Hat JBoss Data Grid のリモートクライアントサーバーモードの
JdbcMixedStore
の設定です。
<local-cache name="customCache"> <mixed-keyed-jdbc-store datasource="java:jboss/datasources/JdbcDS" passivation="true" preload="false" purge="false"> <binary-keyed-table prefix="MIX_BKT2"> <id-column name="id" type="${id.column.type}"/> <data-column name="datum" type="${data.column.type}"/> <timestamp-column name="version" type="${timestamp.column.type}"/> </binary-keyed-table> <string-keyed-table prefix="MIX_STR2"> <id-column name="id" type="${id.column.type}"/> <data-column name="datum" type="${data.column.type}"/> <timestamp-column name="version" type="${timestamp.column.type}"/> </string-keyed-table> </mixed-keyed-jdbc-store> </local-cache>
この設定例で使用された要素とパラメーターの詳細については、「キャッシュストア設定の詳細 (リモートクライアントサーバーモード)」を参照してください。
18.6.3.2. JdbcMixedStore の設定 (ライブラリーモード)
mixedKeyedJdbcStore
の設定例は次のとおりです。
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd urn:infinispan:config:jdbc:6.0 http://www.infinispan.org/schemas/infinispan-cachestore-jdbc-config-6.0.xsd" xmlns="urn:infinispan:config:6.0"> <!-- Additional configuration elements here --> <persistence> <mixedKeyedJdbcStore xmlns="urn:infinispan:config:jdbc:6.0" fetchPersistentState="false" ignoreModifications="false" purgeOnStartup="false" key2StringMapper="org.infinispan.persistence.keymappers.DefaultTwoWayKey2StringMapper"> <connectionPool connectionUrl="jdbc:h2:mem:infinispan_binary_based;DB_CLOSE_DELAY=-1" username="sa" driverClass="org.h2.Driver"/> <binaryKeyedTable dropOnExit="true" createOnStart="true" prefix="ISPN_BUCKET_TABLE_BINARY"> <idColumn name="ID_COLUMN" type="VARCHAR(255)" /> <dataColumn name="DATA_COLUMN" type="BINARY" /> <timestampColumn name="TIMESTAMP_COLUMN" type="BIGINT" /> </binaryKeyedTable> <stringKeyedTable dropOnExit="true" createOnStart="true" prefix="ISPN_BUCKET_TABLE_STRING"> <idColumn name="ID_COLUMN" type="VARCHAR(255)" /> <dataColumn name="DATA_COLUMN" type="BINARY" /> <timestampColumn name="TIMESTAMP_COLUMN" type="BIGINT" /> </stringKeyedTable> </mixedKeyedJdbcStore> </persistence>
この設定例で使用された要素とパラメーターの詳細については、「キャッシュストア設定の詳細 (ライブラリモード)」を参照してください。
18.6.3.3. JdbcMixedStore のプログラムを使用した設定
以下は、
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");
手順18.6 プログラムを使用した JdbcMixedStore の設定
ConfigurationBuilder
を使用して、新規の設定オブジェクトを作成します。- このストアに関連する特定の設定を構築するには、
JdbcMixedStore
設定ビルダーを追加します。 fetchPersistentState
パラメーターは、キャッシュの永続ステートを取り込むかどうかを決定し、クラスターに参加する際にこれをローカルキャッシュストアに適用します。キャッシュストアが共有される場合、キャッシュが同じキャッシュストアにアクセスする際に、fetch persistent 状態は無視されます。複数のキャッシュローダーでこのプロパティーがtrue
に設定されている場合にキャッシュサービスを起動すると、設定の例外がスローされます。fetchPersistentState
プロパティーはデフォルトでfalse
になります。ignoreModifications
パラメーターは、書き込み操作を共有キャッシュローダーではなく、ローカルファイルキャッシュローダーに許可することで、書き込みメソッドを特定のキャッシュローダーにプッシュするかどうかを決定します。場合によっては、一時的なアプリケーションデータが、インメモリーキャッシュと同じサーバー上のファイルベースのキャッシュローダーにのみ存在する必要があります。たとえば、これはネットワーク内のすべてのサーバーによって使用される追加の JDBC ベースのキャッシュローダーで適用されます。ignoreModifications
はデフォルトではfalse
です。purgeOnStartup
パラメーターは、初回起動時にキャッシュがパージされるかどうかを指定します。- テーブルを以下のように設定します。
dropOnExit
は、キャッシュストアが停止している際にテーブルを破棄するかどうかを決定します。これは、デフォルトではfalse
に設定されます。createOnStart
は、現在テーブルが存在しない場合にキャッシュストアを起動すると、テーブルを作成します。このメソッドはデフォルトではtrue
です。tableNamePrefix
は、データが保存されるテーブルの名前にプレフィックスを設定します。idColumnName
プロパティーは、キャッシュキーまたはバケット ID が保存される列を定義します。dataColumnName
プロパティーは、キャッシュエントリーまたはバケット ID が保存される列を指定します。timestampColumnName
要素は、キャッシュエントリーのタイムスタンプまたはバケットが保存される列を指定します。
connectionPool
要素は、次のパラメーターを使用して JDBC ドライバーの接続プールを指定します。connectionUrl
パラメーターは、JDBC ドライバー固有の接続 URL を指定します。username
パラメーターには、connectionUrl
経由で接続するために使用されるユーザー名が含まれます。driverClass
パラメーターは、データベースに接続するために使用されるドライバーのクラス名を指定します。
注記
プログラムを使用した設定は、Red Hat JBoss Data Grid ライブラリーモードのみで利用できます。
18.6.4. キャッシュストアのトラブルシューティング
18.6.4.1. JdbcStringBasedStore の IOExceptions
JdbcStringBasedStore
を使用している時に IOException Unsupported protocol version 48 エラーが発生した場合は、データ列タイプが正しいタイプである BLOB
や VARBINARY
ではなく、VARCHAR
や CLOB
などに設定されていることを示しています。JdbcStringBasedStore
は文字列であるキーのみを必要とし、値はバイナリー列に保存されるため、すべてのデータタイプを値に使用できます。