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 は文字列であるキーのみを必要とし、値はバイナリー列に保存されるため、すべてのデータタイプを値に使用できます。