この章の内容は次のとおりです。
ArrayList、HashSet、HashMapなど)は、Coherence*Extendクライアントによってキャッシュされると、不変の配列としてデシリアライズされます。親トピック: はじめに
Oracle JVMでは、まだ設定されていない場合は、NIOメモリーを手動で設定できます。
-XX:MaxDirectMemorySize=MAX_HEAP_SIZE
この項には次のトピックが含まれます:
それぞれのアプリケーションのスレッドの要件は、クライアント数と実行中の処理の量に応じて異なります。パフォーマンスを綿密にモニターして、クライアント・リクエストに十分対応するスレッドを確保し、さらにクライアントがスレッドで飽和しないようにします。さらに、スレッド・プールで最大数のスレッドが使用されているときにはログ・メッセージが発行されます。このメッセージによって、追加のスレッドが必要であることを認識できます。
クライアント・アプリケーションは、アクティブ・アプリケーションとパッシブ・アプリケーションの2つの一般カテゴリに分類できます。アクティブなアプリケーションでは、Extendクライアントが多数のリクエスト(PUT、GETなど)を送信し、それらがProxyサービスによって処理されます。Proxyサービスが、これらの多数のタスクを十分に処理するためには大量のスレッドを必要とします。
パッシブ・アプリケーションでは、クライアントは、特定の基準に基づいてイベント(マップ・リスナーなど)を待ちます。イベントは、分散キャッシュ・サービスによって処理されます。このサービスはワーカー・スレッドを使用してイベントをクライアントにプッシュします。このタスクに対応するため、分散キャッシュ・サービスのスレッド・プール構成には、十分なワーカー・スレッドを確保するようにします。『Oracle Coherenceでのアプリケーションの開発』のdistributed-schemeに関する項を参照してください。
注意:
Extendクライアントのニア・キャッシュでは、ALL、PRESENTおよびAUTOの無効化戦略を実行する場合にマップ・リスナーが使用されます。書込み量が多く、ニア・キャッシュを使用するアプリケーションでは、多数のマップ・イベントが生成されます。
プロキシ・サービスにスレッド・プールのしきい値を設定するには、<proxy-scheme要素内に<thread-count-maxおよび<thread-count-min要素を追加します。『Oracle Coherenceでのアプリケーションの開発』のproxy-schemeに関する項を参照してください。次の例は、新しいデフォルト・プール設定を変更します。
注意:
スレッド・プールはデフォルトで有効になっており、構成は必要ありません。デフォルトの設定で、任意の時点での負荷に基づいて、Coherenceによってスレッド数が自動的にチューニングされます。自動チューニングでは不十分な場合にのみ、スレッド・プールを明示的に構成することを検討してください。
最小および最大スレッド数をゼロに設定すると、プロキシ・サービスのスレッドがすべてのリクエストを処理するように強制され、ワーカー・スレッドは使用されません。プロキシ・サービス・スレッドを使用してクライアントのリクエストを処理することはお薦めできません。
<proxy-scheme> <service-name>ExtendTcpProxyService</service-name> <thread-count-max>75</thread-count-max> <thread-count-min>10</thread-count-min> <autostart>true</autostart> </proxy-scheme>
coherence.proxy.threads.maxおよびcoherence.proxy.threads.minシステム・プロパティは、キャッシュ構成ファイルを使用するかわりに、動的なスレッド・プールのしきい値を指定します。次に例を示します。
-Dcoherence.proxy.threads.max=75-Dcoherence.proxy.threads.min=10
ほとんどの用途で、プロキシ・サービスがリクエストを処理するための十分なスレッドを確保にするには、動的なスレッド・プール設定が最も適しています。クライアントの用途が明確な制御されたアプリケーションでは、<thread-count-min>および<thread-count-max>要素を同じ値に設定して、スレッドの数を明示的に指定できます。次の例では、プロキシ・サービス用に10スレッドを設定します。追加のスレッドは自動的には作成されません。
<proxy-scheme> <service-name>ExtendTcpProxyService</service-name> <thread-count-min>10</thread-count-min> <thread-count-max>10</thread-count-max> <autostart>true</autostart> </proxy-scheme>
InvocationServiceにより、サービスのメンバーはクラスタ内の任意のノード上で任意のコードを起動できます。ただし、Coherence*Extendでは、InvocationServiceコールは、クライアントがデフォルトで接続されるプロキシによって処理されます。ArrayList、HashSet、HashMapなど)は、Coherence*Extendクライアントによってキャッシュされると、不変の配列としてデシリアライズされます。オブジェクトが抽出されて元の型にキャストされると、ClassCastExceptionsが返されます。代替策としては、Javaインタフェース・オブジェクト(List、Set、Mapなど)を使用するか、またはコレクション・オブジェクトを別のオブジェクトにカプセル化します。次の例では、この両方のテクニックを示しています。
例6-1 ArrayListオブジェクトのキャスト
public class ExtendExample
{
@SuppressWarnings({ "unchecked" })
public static void main(String asArgs[])
{
System.setProperty("coherence.cacheconfig", "client-config.xml");
NamedCache cache = CacheFactory.getCache("test");
// Create a sample collection
List list = new ArrayList();
for (int i = 0; i < 5; i++)
{
list.add(String.valueOf(i));
}
cache.put("list", list);
List listFromCache = (List) cache.get("list");
System.out.println("Type of list put in cache: " + list.getClass());
System.out.println("Type of list in cache: " + listFromCache.getClass());
Map map = new TreeMap();
for (Iterator i = list.iterator(); i.hasNext();)
{
Object o = i.next();
map.put(o, o);
}
cache.put("map", map);
Map mapFromCache = (Map) cache.get("map");
System.out.println("Type of map put in cache: " + map.getClass());
System.out.println("Type of map in cache: " + mapFromCache.getClass());
}
}
現在のリリースのCoherenceでは、キャッシュ・サーバーに対してPOFシリアライザを構成するオプションがあります。
これによって、アプリケーションに次の影響が及ぶ可能性があります。
putまたはgetの操作のみを実行する.NETまたはC++のクライアントでは、Javaバージョンのオブジェクトは不要です。(入力プロセッサやキャッシュ・ストアなどのために)サーバー側でデシリアライズが実行される場合、Javaバージョンは必要です。
POFシリアライザを使用することで、プロキシでシリアライズ/デシリアライズを実行する必要がなくなるため、メモリーとCPUの要件が小さくなります。
プロキシ内のキー操作はお薦めできません。これにより、POFシリアライザで使用されるオブジェクト装飾が影響を受け、Extendクライアントがキーを認識できなくなる場合があります。
例6-2は、オペレーション・デプロイメント・ディスクリプタで定義されるデフォルトのPOFシリアライザを構成する、キャッシュ構成ファイルの抜粋を示しています。
例6-2 分散キャッシュに対するPOFシリアライザの構成
...
<distributed-scheme>
<scheme-name>dist-default</scheme-name>
<serializer>pof</serializer>
<backing-map-scheme>
<local-scheme/>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
...