24 Coherenceプログラミングの概要

必須のCoherence Java APIのリストを確認し、ジェネリック、ラムダ、ストリーム、およびデフォルト・メソッドのCoherenceサポートについて学習します。

Coherence C#およびC++ APIの使用の詳細は、Oracle Coherenceリモート・クライアントの開発ExtendクライアントAPIを参照してください。

この章の内容は次のとおりです。

Coherence APIの概要

Coherence APIでは、キャッシュとやりとりしたり、キャッシュされたデータを処理できる多くのプログラミング機能が提供されます。このリリースでは、Coherence APIは、トピックに値をパブリッシュおよびサブスクライブする手段を提供します。Coherence APIの詳細なリファレンスについては、Oracle Coherence Java APIリファレンスを参照してください。

SessionインタフェースおよびCacheFactoryクラスの理解

SessionインタフェースおよびCacheFactoryクラスは、Coherenceアプリケーションの主要なエントリ・ポイントです。どちらのAPIもNamedCacheインタフェースの管理に使用され、キャッシュ・インスタンスの作成、リリースおよびデストロイに最もよく使用されます。キャッシュ・インスタンスの取得を参照してください。

NamedCacheインタフェースの理解

NamedCacheは、クラスタのメンバー間で共有されるリソースを保持するMap実装です。リソースはメモリー内で管理する必要があり、通常は、多くの場合データベースに恒久的に保存されるデータ、または大幅なコストでアセンブルまたは計算されたデータから構成されます。

NamedCacheインタフェースでは、キャッシュ操作を実行するための多くのメソッドが提供され、キャッシュの問合せ、キャッシュ・エントリの処理、キャッシュ・イベントのリスナーの登録、キャッシュ・エントリへの同時アクセスの制御の機能を追加する、様々なマップ操作を拡張します。

AsyncNamedCacheインタフェースは、非同期バージョンのNamedCacheインタフェースです。インタフェースでは、CompleteableFuture APIをJava java.util.concurrentパッケージから使用し、キャッシュ操作を非同期に実行します。

基本的なキャッシュ操作の実行を参照してください。

問合せ用API

QueryMapインタフェースでは、キャッシュ・エントリから抽出される値で動作する様々なフィルタを使用してキャッシュを問い合せることができます。インタフェースでは、索引の追加と削除も可能です。索引は、キャッシュに格納されている値と、対応するキーの関連付けに使用され、パフォーマンスを大幅に向上できます。「キャッシュ内のデータの問合せ」を参照してください。

キャッシュ処理用API

InvocableMapインタフェースでは、キャッシュでのエントリ別処理と集計操作の両方を起動できます。キャッシュの内容に対する操作は、キャッシュによって(したがって、特定の領域に制限されたキャッシュの内容の中で)実行できます。この機能は特に分散環境で役立ちます。これは、処理対象のエントリが管理されている場所に処理を移すことで、処理を局所化して効率を高めることができるためです。

入力プロセッサは、キャッシュ内のエントリ・オブジェクトに対して作動するエージェントです。Coherenceには、一般的な多くの操作の実行に使用可能な、事前定義済の多くのエントリ・プロセッサが用意されています。プロセッサはcom.tangosol.util.processorパッケージに定義されています。

エントリ・アグリゲータは、エントリの一部のサブセットに対して実行し、集計結果を得るように指定できる処理を表します。集計の一般的な例として、最小、最大、合計、平均などの関数があります。ただし、集計の概念は、エントリのグループを評価して1つの答えを算出する必要のある任意のプロセスに適用されます。集計は、分散環境でパラレルに実行する機能を明示的に備えています。

キャッシュ内のデータの処理を参照してください。

イベント用API

Coherenceでは、イベントを処理するための2つのプログラミング・モデルがあります。ObservableMapインタフェースは、キャッシュの内容が変更されたときにアプリケーションがイベントを受信できるようにします。変更イベントに関心があることを登録するには、そのキャッシュに対するListener実装をアプリケーションで追加します。対象キャッシュでは、イベント・タイプ(挿入、更新、削除)、変更されたエントリのキー、およびエントリの古い値と新しい値などに関する情報を含むイベントが受信されます。(マップ・イベントの使用を参照してください)。

ライブ・イベント・モデルは、イベント・インターセプタを使用して、クラスタ内で発生する特定のイベントをリスニングします。インターセプタは、イベント・タイプごとに作成され、連鎖できます。イベント・タイプは、パーティション・キャッシュとサーバー・イベント、ライフサイクル・イベントおよびフェデレーテッド・キャッシュ・イベントに定義されます。ライブ・イベントの使用を参照してください。

トランザクション用API

Coherenceには、様々なトランザクションの保証が得られる各種のトランザクション・オプションが用意されています。ConcurrentMap APIは、明示的なロックを提供するロックAPIです。エントリ・プロセッサでは、ロック・フリーなプログラム・モデルも提供されるため、競合や待機時間が最小限に抑えられ、データ操作のフォルト・トレランスを犠牲にすることなく、システム・スループットを向上させます。最後に、トランザクション・フレームワークAPIは接続ベースのAPIで、これにより、クライアントに障害が発生した場合でも、パーティションおよびキャッシュ全体にわたって原子性トランザクションが保証されます。トランザクションの実行を参照してください。

Coherenceのシリアライズ

Coherenceは値オブジェクトをキャッシュします。これらのオブジェクトは、(セッション・データや一時データなどの)内部ソースのデータ、または(データベースやメインフレームなどの)外部ソースのデータのいずれでもかまいません。

キャッシュに配置されたオブジェクトはシリアライズ可能である必要があります。シリアライズは、多くの場合、クラスタ化されたデータ管理における最も費用を要する部分になるため、Coherenceではデータのシリアライズ/デシリアライズ用に様々なオプションを用意しています。

  • com.tangosol.io.pof.PofSerializer - Portable Object Format (POF)は言語に依存しないバイナリ形式です。POFは領域と時間の両面で効率を向上させるように設計された、Coherenceの推奨シリアライズ・オプションです。Portable Object Formatの使用を参照してください

  • java.io.Serializable - 最も単純で処理の遅いオプション。

  • java.io.Externalizable - このオプションでは、開発者が手動でシリアライズを実装する必要がありますが、パフォーマンスの大幅な向上が見込めます。java.io.Serializableと比較して、シリアライズされたデータのサイズを2倍以上削減できます。データ・サイズが小さくなると、一般にシリアライズされた形式でデータがキャッシュされるため、特に分散キャッシュで役に立ちます。最も重要なのは、CPU使用率が劇的に削減されるということです。

  • com.tangosol.io.ExternalizableLite - このオプションはjava.io.Externalizableと非常によく似ていますが、より効率的なI/Oストリームの実装を使用することで、パフォーマンスの向上とメモリー使用量の削減を図れます。

  • com.tangosol.run.xml.XmlBeanExternalizableLiteのデフォルトの実装です。

ノート:

オブジェクトをシリアライズする場合は、Javaのシリアライズ機能によって、すべての参照可能オブジェクトが自動的に(MapListなどのコレクションを含むオブジェクト参照を使用して)クロールされます。したがって、キャッシュされたオブジェクトは親オブジェクトを直接参照してはなりません(整数のような特定の値を保持することは許されます)。独自のシリアライズ・ルーチンを実装するオブジェクトは影響を受けません。

ジェネリクスのサポート

CoherenceプログラミングAPIでは、Javaジェネリクスを使用して、コンパイルの型推論とともにコンパイル時と実行時の型チェックを一緒に実行できます。Java Genericsが初めての場合は、JavaチュートリアルGenerics Lessonを参照してください。多くのCoherenceインタフェースとパブリック・クラスには、関連付けられた型があります。ジェネリクスでは、コードの簡素化、キャストの軽減および型の安全性の向上が可能です。必須ではありませんが、型チェックを行うことをお薦めします。

Javaジェネリクスのサポートに加えて、Coherenceでは、NamedCacheインスタンスを作成する場合、またはキャッシュ構成ファイルにキャッシュを定義する場合に、型を明示的に構成できます。NamedMap型チェックの使用を参照してください。

ノート:

このマニュアルの例は、ジェネリクスを使用するように記述できません。ただし、Coherence APIでプログラミングする場合は、ジェネリクスの使用が標準的なアプローチであることが求められます。