2016-11-14 14 views
1

私はコヒーレンス・キャッシュにアクセスする単一のJAVAプロセスが存在するいくつかのノード(最大30個)で構成されたレプリケート・クラスタを持ち、エージェントの作成と更新の両方にmap.invoke(key、agent)メソッドを使用します。作成および更新は、処理方法の値を設定して実行されます。私は更新をすることによって行われた場合に気づいOracleの一貫性:特定のノードでエージェントを強制的に呼び出す方法はありますか?

public Object process(Entry entry) { 
    if (entry.isPresent()) 
    { 
    //UPDATE 
    ... some stuff which compute the new entry value... 
    entry.setValue(newValue, true); 
    return newValue 
    } 
    else 
    { 
    //CREATION 
    ..other stuff to determine the value... 
    entry.setValue(value, true); 
    return value; 
    } 
} 

:エージェント・オブジェクトの次のコードを呼び出す

map.invoke(key, agent); 

例(エージェントのEntryProcessorインタフェースを実装ConcreteEntryProcessorのインスタンスです)エージェントを作成したノード私は良いパフォーマンスを持っています。そうでなければ、更新が別のノードから行われるとパフォーマンスが低下します。データの所有権の種類があるようです。

エージェントをローカルノード上で強制的に実行する方法や、データの所有権を変更する方法はありますか?

+0

「私はmap.invoke(key、agent)メソッドをエージェントの作成と更新の両方に使用します」とはどういう意味ですか?この場合の 'agent'は' key'で指定されたキャッシュエントリで動作する 'EntryProcessor'のインスタンスです。' map.invoke'でエージェント( 'EntryProcessor's)をどのように作成/更新するのか分かりません。これまでに試したことのいくつかの例を示してください。 –

+0

あなたのコメントに答えるために質問を修正しました.. – Fernando

答えて

0

すべてはキャッシュ設定に依存します。分散(パーティション化された)キャッシュを使用する場合、実際には何らかのデータ所有権があります。その場合、エントリプロセッサは、与えられたキーを所有するノード上で呼び出されます。

そして、あなたのパフォーマンスの問題に応じて、私は2つの可能性を参照してください。map.invoke(key, agent)減少の

  1. パフォーマンスを、しかしEntryProcessor.process(entry)のパフォーマンスが安定しています。その場合、パフォーマンスの問題はおそらく、map.invoke(key, agent)を呼び出したノードに処理の結果を返すために必要なシリアライゼーションとネットワークトラフィックによって引き起こされます。そのノードでこの値を必要としない場合は、入力プロセッサーからnullを戻すだけです。

  2. パフォーマンスはEntryProcessor.process(entry)になります。その場合、作成/更新ロジックは、map.invoke(key, agent)というノードからのデータを必要とします。だからそれは再び逐次化/ネットワークトラフィックの問題ですが、あなたの特定のロジックの詳細を知らないと、あなたの問題に対する解決策を見つけることは困難です。

関連する問題