第5章 バッチ化 API
5.1. バッチ化 API
Red Hat JBoss Data Grid クラスターがトランザクションの唯一の参加者である場合、バッチ化 API
が使用されます。複数のシステムがトランザクションの参加者である場合は、トランザクションマネージャーを使用する Java トランザクション API (JTA
) のトランザクションが使用されます。
バッチ化 API は Red Hat JBoss Data Grid のライブラリーモードでのみ使用できます。
5.2. Java トランザクション API
Red Hat JBoss Data Grid では、Java トランザクション API (JTA) に対応するトランザクションの設定、使用、および参加がサポートされます。
JBoss Data Grid は各キャッシュ操作に対して以下を実行します。
- 最初に、現在スレッドに関連付けされているトランザクションを読み出します。
- XAResource が登録されていない場合は、トランザクションマネージャーに登録し、トランザクションがコミットまたはロールバックされたときに通知を受け取るようにします。
5.3. バッチ化および Java トランザクション API (JTA)
Red Hat JBoss Data Grid では、バッチ化機能により、JTA
トランザクションがバックエンドで開始され、スコープ内のすべての呼び出しがそれに関連付けられます。このため、バッチ化機能は単純なトランザクションマネージャー実装をバックエンドで使用します。結果として、次の動作が行われます。
- 呼び出し中に取得されたロックは、トランザクションがコミットまたはロールバックするまで保持されます。
- すべての変更は、クラスター内のすべてのノード上にあるバッチでトランザクションコミットプロセスの一部としてレプリケートされます。複数の変更が単一のトランザクション内で確実に行われるようにするため、レプリケーショントラフィックがより少ない状態になり、パフォーマンスが向上します。
- 同期のレプリケーションまたはインバリデーションを使用する場合、レプリケーションまたはインバリデーションに失敗するとトランザクションはロールバックされます。
- キャッシュがトランザクションで、キャッシュローダーが存在する場合、キャッシュローダーはキャッシュのトランザクションに登録されません。そのため、トランザクションがインメモリー状態を適用し、変更をストアに適用できないと (部分的に)、キャッシュローダーレベルで不整合が発生する可能性があります。
- トランザクションに関連するすべての設定はバッチ化にも適用されます。
5.4. バッチ化 API の使用
5.4.1. バッチ化 API の設定
バッチ化 API を使用するには、以下の例のようにキャッシュ設定で呼び出しのバッチ化を有効にします。
Configuration c = new ConfigurationBuilder().transaction().transactionMode(TransactionMode.TRANSACTIONAL).invocationBatching().enable().build();
Red Hat JBoss Data Grid では、呼び出しバッチ化はデフォルトで無効になり、バッチ化は定義されたトランザクションマネージャーなしで使用できます。
5.4.2. バッチ化 API の使用
キャッシュがバッチ化を使用するよう設定された後に、キャッシュで次のように startBatch()
および endBatch()
を呼び出して、バッチ化を使用します。
Cache cache = cacheManager.getCache();
バッチを使用しない場合
cache.put("key", "value");
cache.put(
行が実行されると、値はすぐに置き換えられます。
key
, value
);
バッチを使用する場合
cache.startBatch(); cache.put("k1", "value"); cache.put("k2", "value"); cache.put("k3", "value"); cache.endBatch(true); cache.startBatch(); cache.put("k1", "value"); cache.put("k2", "value"); cache.put("k3", "value"); cache.endBatch(false);
行 cache.endBatch(
が実行されると、バッチの開始後に行われたすべての変更が適用されます。
true
);
行 cache.endBatch(
が実行されると、バッチで行われた変更は破棄されます。
false
);