2017-06-30 6 views
1

Oracle Coherenceの新機能であるサンプルプロジェクトに、2つのキャッシュ間のトランザクション管理を可能にする機能を追加する必要があります。Oracle Coherence:2つのキャッシュ間のトランザクション管理

私たちはNamedCacheからトランザクションオブジェクトを取得するので、異なる2つのキャッシュに対して2つの異なるNamedCacheオブジェクトがあります。どのように私は2つのキャッシュ間のトランザクション管理を可能にする機能を達成することができます。

シングルキャッシュの場合、以下のコードでトランザクション管理ができます。

public class TransactionExample extends Base { 
    public static void main(String[] args) { 
     // populate the cache 
     NamedCache cache = CacheFactory.getCache("dist-extend"); 
     cache.clear(); 
     String key1 = "key1"; 
     String key2 = "key2"; 

     //cache.clear(); 
     // create one TransactionMap per NamedCache 
     TransactionMap mapTx = CacheFactory.getLocalTransaction(cache); 
     mapTx.setTransactionIsolation(TransactionMap.TRANSACTION_REPEATABLE_GET); 
     mapTx.setConcurrency(TransactionMap.CONCUR_PESSIMISTIC); 

     // gather the cache(s) into a Collection 
     Collection txnCollection = java.util.Collections.singleton(mapTx); 
     boolean fTxSucceeded = false; 

     try { 
      // start the transaction 
      mapTx.begin(); 

      mapTx.put(key1, new Integer(1001)); 
      //generateException() 
      mapTx.put(key2, new Integer(2001)); 

      // commit the changes 
      fTxSucceeded = CacheFactory.commitTransactionCollection(txnCollection, 1); 

      int v1 = ((Integer) cache.get(key1)).intValue(); 
      int v2 = ((Integer) cache.get(key2)).intValue(); 

      out("Transaction " + (fTxSucceeded ? "succeeded" : "did not succeed")); 

      out("After Insert into Tx Object Updated value for key 1: " + v1); 
      out("After Insert into Tx Object Updated value for key 2: " + v2); 
      //CacheFactory.shutdown(); 
     } 

     catch (Exception t) { 
      // rollback 

      CacheFactory.rollbackTransactionCollection(txnCollection); 
      t.printStackTrace(); 
     } 



     /*azzert(v1 == 2, "Expected value for key1 == 2"); 
     azzert(v2 == 2, "Expected value for key2 == 2");*/ 
     // 
     out("Updated Value From Cache key 1: " + cache.get(key1)); 
     out("Updated Value From Cache key 2: " + cache.get(key2)); 
    } 

    public static void generateException() throws Exception 
    { 
     throw new Exception("Manual Error Throw"); 
    } 
} 

答えて

2

Oracleのドキュメントによれば、Connection APIを使用してこれを実現できます。両方のキャッシュはtransactionalで、Connectionクラスの同じインスタンスから取得する必要があります。例hereを参照してください。

キャッシュとデータソースの間で同期を使用する予定がある場合、この機能は使用する同期化戦略(ライトスルー、ライトビハインドなど)によって異なる動作をする可能性があることに注意してください。

関連する問題