プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Coherenceでのアプリケーションの開発
12c (12.2.1.2.0)
E82725-02
目次へ移動
目次

前
次

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

この章では、キャッシュおよびデータ・グリッド操作の実行に使用されるCoherence Java APIの概要について説明します。

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

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

19.1 Coherence APIの概要

この項では、Coherence Java 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などのコレクションを含むオブジェクト参照を使用して)クロールされます。したがって、キャッシュされたオブジェクトは親オブジェクトを直接参照してはなりません(整数のような特定の値を保持することは許されます)。独自のシリアライズ・ルーチンを実装するオブジェクトは影響を受けません。

19.2 ジェネリクスのサポート

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

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

注意:

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

19.3 Java 8機能のサポート

Coherence APIは、Java 8リリースに導入されたプログラム機能を使用できるように更新されています。この機能には、ラムダ、ストリームおよびデフォルトのメソッドが含まれています。これらの機能により、データ・グリッド操作の実行時の使いやすさと柔軟性が実現します。

ラムダ

Javaラムダ実装では、コードを引数として渡し、結果として返すことを可能にする一定レベルの関数型プログラミングが可能です。ラムダは、関数型インタフェース(単一の抽象メソッドが含まれるインタフェース)を操作する場合に、匿名の内部クラスのかわりによく使用されます。ラムダ式での使用に最適な、既存の多くの関数型インタフェースがあります。新しい汎用関数型インタフェース(例: FunctionPredicateSupplierConsumerなど)もあり、これらも同様に便利です。

多くのCoherenceインタフェースは、ラムダ式で使用可能な関数型インタフェースであり、このガイド全体で示されています。Coherenceでの最も一般的なラムダ式の使用は、値の抽出、エントリの問合せとフィルタ、およびエントリの処理です。Oracle Coherenceのインストールラムダ式を使用したエントリの処理およびCoherence Java 8機能のサンプルを参照してください。

Javaのラムダが初めての場合は、次のリソースを参照してください。

ストリーム

Javaストリーム実装では、マルチ・コア・アーキテクチャを利用するために、データの問合せと処理を順次またはパラレルに実行する効率的な方法を提供します。処理は次のステップで実行されます。

  • データは、ソース(コレクションや配列など)から読取り専用ストリームに集計されます。ストリームは、オブジェクト参照を表し、実際はデータを格納しません。

  • 次に、中間操作がストリームで宣言されます。フィルタリング、ソート、マッピングなどの中間操作がサポートされます。ラムダ式は、中間操作の宣言時に多く使用され、データを機能的に操作します。中間操作は集計されて連鎖可能になり、後続の各操作は、前の操作の結果が含まれるストリームで実行されます。中間操作は遅延し、最終的な終端操作が実行されるまで実際に実行されません。

  • 最終的な終端操作が宣言されます。カウント、追加、平均などの終端操作がサポートされています。終端操作は、ストリームのオブジェクトを自動的に反復処理し、集計結果を返します。

Javaストリームでは、Coherenceデータ・グリッド集計と同様の機能を提供します。ただし、分散環境で実行した場合、ストリームは効率的ではなくなります。ストリーム・プログラミング・モデルを活用し、さらにストリームをクラスタ間でリモートで実行できるようにするために、Coherenceではcom.tangosol.util.streamおよびcom.tangosol.internal.util.streamパッケージのStreams APIを拡張しています。

Oracle Coherenceのインストールストリームを使用したデータ・グリッドの集計の実行およびCoherence Java 8機能のサンプルを参照してください。

ストリームが初めての場合は、次のリソースを参照してください。

デフォルトのメソッド

Javaデフォルト・メソッド実装では、インタフェースの既存の実装を更新する必要なく、新いメソッドを既存のインタフェースに追加する方法を提供します。新しいメソッドは、defaultキーワードを使用してインタフェースに追加されます。既存の実装では、デフォルト・メソッドをインタフェースに定義済として使用する、新しい実装が必要となるようにメソッドを抽象として再宣言する、またはデフォルトの実装を新しい実装でオーバーライドするように選択できます。デフォルト・メソッドは、ラムダ式を既存のインタフェースに対するパラメータとして受け入れるメソッドを追加する場合に使用することもできます。

java.util.Mapインタフェースは、エントリのマージやすべてのエントリの置換などの機能を追加するデフォルト・メソッドが含まれるように更新されています。Coherenceアプリケーションでは、NamedCacheインタフェースを介してこれらのメソッドを利用できますが、デフォルト・メソッド実装では、データ局所性を前提とし、スレッド・セーフでもクラスタ・セーフでもありません。このため、デフォルト・メソッドは、ラムダ式を活用したエントリ・プロセッサを使用して再実装されています。

Oracle Coherenceのインストールデフォルトのマップ操作の使用およびCoherence Java 8機能のサンプルを参照してください。

デフォルト・メソッドが初めての場合は、次のリソースを参照してください。