この演習では、Coherenceクラスタ・キャッシュの単純なタイプの情報にアクセスし、更新および削除を行うための、単純なJavaコンソールベースのアプリケーションを開発します。また、Coherence Java APIの使用についても学習します。JDeveloperを使用して、次のタスクを実行します。
新規プロジェクトの作成
新規NamedCacheの作成
キャッシュに情報を格納して取得
キャッシュに関する情報の取得
この章の内容は次のとおりです。
Coherenceのキャッシュはすべて名前が付けられており、所属するクラスタ・インスタンスによって存続期間が調べられ、com.tangosol.net.NamedCacheインタフェースを実装します。NamedCacheインタフェースはjava.util.Mapを拡張したもので、クラスタ・メンバー間で共有されているデータおよびリソースが保持されます。NamedCacheにはそれぞれ、データがキーと値のペアとして保持されます。キーと値のオブジェクト・タイプは、単一でも複合でもかまいません。NamedCacheインタフェースは、ロックおよび同期、記憶域統合、問合せ、イベント集計、トランザクションなどの拡張機能をMapインタフェースに提供します。表3-1で、NamedCacheインタフェース内でよく使用されるメソッドをいくつか説明します。
表3-1 NamedCacheインタフェースのメソッド
| メソッド名 | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
このキーのエントリを |
|
|
オブジェクトをキャッシュに挿入して、前の値がある場合はこれを返します。 |
|
|
この |
|
|
一連のキーと値のペアを返します。 |
|
|
すべての値をコレクションとして再取得します。 |
|
|
この |
com.tangosol.net.CacheFactoryクラスは通常、NamedCacheのインスタンスを取得するために使用します。表3-2で、CacheFactoryクラス内でよく使用されるメソッドをいくつか説明します。
表3-2 CacheFactoryクラスのメソッド
| メソッド名 | 説明 |
|---|---|
|
|
Coherenceのサービスを実行しているクラスタ・オブジェクトを取得します。 |
|
|
すべてのクラスタ・サービスをシャットダウンします。 |
|
|
キャッシュのインスタンスを返します。クラスタ内の既存のキャッシュに参加するか、これが最初のメンバーである場合はキャッシュを作成します。 |
NamedCacheインタフェースおよびCacheFactoryクラスのメソッドの詳細な一覧は、C:\oracle\product\coherence\docにあるJavadocを参照してください。
この項では、Coherenceクラスタ・キャッシュの単純なタイプの情報にアクセスし、更新および削除を行うJavaプログラムの作成方法について説明します。
次の手順に従い、CoherenceのJavaベース・アプリケーションを作成します。
JDeveloperで新規プロジェクトを作成します。プロジェクトにInsertValueという名前を付けます。ディレクトリがC:\home\oracle\labs\InsertValueになっていることを確認します。
詳細な手順は、「既存アプリケーションでの新規プロジェクトの作成」を参照してください。
Coherenceエントリについて、「プロジェクト・プロパティ」の下の「ライブラリとクラスパス」の値をチェックします。coherence.jarのフルパスC:\oracle\product\coherence\lib\coherence.jarが指定されていることを確認します。
最初のCoherence Javaプログラムを作成します。クラスにMyFirstSampleという名前を付け、「mainメソッド」チェック・ボックスを選択します。
詳細は、「Javaクラスの作成」を参照してください。
JDeveloperエディタで、NamedCacheを作成するコードを記述して値を挿入してから、挿入した値を検証します。コード作成の終了後にファイルを保存します。例3-1にサンプル・プログラムを示します。
例3-1 NamedCacheの作成、値の挿入および検証
package com.oracle.handson;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
public class MyFirstSample {
public MyFirstSample() {
}
public static void main(String[] args) {
// create or get a named cache called mycache
NamedCache myCache = CacheFactory.getCache("mycache");
// put key, value pair into the cache.
myCache.put("Name","Gene Smith");
System.out.println("Value in cache is " + myCache.get("Name"));
}
}
稼働しているキャッシュ・サーバーがあれば停止します。
このプログラムをJDeveloperで実行します。エディタでMyFirstSample.javaクラスを右クリックして「実行」を選択します。
次のようなメッセージが表示されます。
次の手順に従い、挿入してから取得するのではなく、単純にキャッシュから値を取得するJavaクラスを作成します。
MyFirstSampleReaderという名前の別のJavaクラスを作成します。詳細は、「Javaクラスの作成」を参照してください。例3-2にサンプル・プログラムを示します。
例3-2 キャッシュからの値の取得
package com.oracle.handson;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
public class MyFirstSampleReader {
public MyFirstSampleReader() {
}
public static void main(String[] args) {
// ensure we are in a cluser
CacheFactory.ensureCluster();
// create or get a named cache called mycache
NamedCache myCache = CacheFactory.getCache("mycache");
System.out.println("Value in cache is " + myCache.get("Name"));
}
}
MyFirstSampleReaderクラスを実行します。図3-2にプログラムの出力を示します。NULL値が返されることに注目してください。MyFirstSampleにより、NamedCacheは正常に作成され、移入が行われますが、このキャッシュが存在するのはMyFirstSampleプロセス・メモリー内のみです。MyFirstSampleが終了すれば、キャッシュも削除されます。
「Coherenceインストールのテスト」で使用したcache-server.cmdを起動し、MyFirstSampleを実行してNamedCacheに値を挿入してから、MyFirstSampleReaderを実行してキャッシュから値を読み取ります。図3-3に示す出力では、MyFirstSampleによって格納されたGene Smithの値が、MyFirstSampleReaderによって返されています。
これは、MyFirstSampleのように、値を挿入してから離脱するなど、1つの操作を実行するためにのみクラスタに参加するプロセスには該当しません。デフォルトでは、すべてのプロセスは記憶域が有効な状態で起動します。プロセスではクラスタの一部としてデータを格納できます。このようなプロセスは、記憶域が無効になるように変更する必要があります。次のJavaコマンドライン・パラメータを使用します。
-Dtangosol.coherence.distributed.localstorage=false
Javaオプション-Dtangosol.coherence.distributed.localstorageは、プロセスで記憶域を有効にするかどうかを指定します。このパラメータをfalseに設定すると、プロセスで記憶域が無効であることが指定されます。
ローカル記憶域を無効にするようプロジェクト・プロパティを変更します。詳細は、「プロジェクト・プロパティの変更によるランタイム構成の設定」を参照してください。
「Javaオプション」フィールドに次の値を入力します。
-Dtangosol.coherence.distributed.localstorage=false -Dtangosol.coherence.log.level=3
Javaプロパティtangosol.coherence.log.level=levelは、Coherenceによって生成されるロギングのレベルを変更します。levelには0〜9の数値を設定できます。デフォルトは5です。0を指定するとロギングは行われません。9を指定すると非常に詳細になります。ほとんどのアプリケーション開発では、多くの場合、この値は3で十分です。
実行中のキャッシュ・サーバーをすべてシャットダウンして、MyFirstSampleクラスを再実行します。
図3-4のように、クラスタで記憶域が有効でないことを示すメッセージが表示されます。これは、このメンバーを記憶域無効に設定しているためです。
キャッシュ・サーバーを再起動し、MyFirstSampleおよびMyFirstSampleReaderを再度実行します。1回目と2回目のJavaのサンプル実行の間にデータが残っていることが確認できます。
この演習では、Coherenceクラスタ・キャッシュの単純なタイプの情報にアクセスし、更新および削除を行うための、単純なJavaコンソールベースのアプリケーションを開発します。
この演習では、「Coherenceインストールのテスト」を完了していると想定しています。キャッシュ・サーバーとキャッシュ・クライアントが稼働中であることを確認します。
通常クライアント・アプリケーションとサーバー・アプリケーションの間で接続および切断が行われるクライアント/サーバー・アプリケーションとは異なり、Coherenceベースのクラスタ・アプリケーションは、クラスタ内に存在することを確認するのみで、確認後もクラスタのサービスを使用できます。Coherenceベースのアプリケーションは通常、アプリケーションのクラスタに接続するのではなく、クラスタの一部になります。
Coherenceクラスタ・キャッシュの単純なタイプの情報にアクセスし、更新および削除を行うJavaコンソールベースのアプリケーションを作成する手順は次のとおりです。
C:\oracle\product\coherence\docディレクトリにあるCoherence Javaドキュメント(Javadoc)で、CacheFactoryクラスのメソッドを調べます。
CacheFactoryクラスを使用してクラスタに参加(ensureClusterメソッドを使用)し、その後クラスタから離脱(shutdownメソッドを使用)する、YourFirstCoherenceApplicationという単純なJavaコンソール・アプリケーション(Javaクラス)を開発します。Javaクラスの作成の詳細は、「Javaクラスの作成」を参照してください。
Javadocを使用して、NamedCacheインタフェースで使用できるメソッドを調べます。
アプリケーションを拡張し、CacheFactoryメソッドgetCacheを使用して、mycacheというキャッシュ(「Coherenceインストールのテスト」の演習で使用したものと同じキャッシュ名)用のNamedCacheを取得するようにします。
NamedCacheインスタンスで、getメソッドを使用して、messageキー(「Coherenceインストールのテスト」の演習で使用したものと同じキー)の値を取得します。
System.out.println(….)メソッドを使用して、値を標準出力に出力します。
例3-3に、CoherenceベースのJavaアプリケーションのサンプルを示します。
例3-3 CoherenceベースのJavaアプリケーションのサンプル
package com.oracle.handson;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
public class YourFirstCoherenceApplication {
public YourFirstCoherenceApplication() {
}
public static void main(String[] args) {
CacheFactory.ensureCluster();
NamedCache myCache = CacheFactory.getCache("mycache");
String message = (String)myCache.get("message");
System.out.println(message);
CacheFactory.shutdown();
YourFirstCoherenceApplication yourfirstcoherenceapplication = new YourFirstCoherenceApplication();
}
}
次の手順に従い、Coherenceアプリケーションを実行します。
Coherenceキャッシュ・サーバーとキャッシュ・クライアントが稼働中であることを確認します。キャッシュ・クライアントで、mycacheキャッシュに接続します。次に例を示します。
Map(?): cache mycache
JDeveloperのIDEからYourFirstCoherenceApplicationを実行して、結果を表示します。
図3-5にYourFirstCoherenceApplicationの出力を示します。この出力は、messageキーのデータがキャッシュに格納されていないことを示しています。
実行中のキャッシュ・クライアントを使用して、messageキーを変更します。たとえば、次のように入力します。
Map <mycache>: put message "hello"
JDeveloperのIDEからYourFirstCoherenceApplicationを再実行して、変更された値を確認します。図3-6に、キャッシュ内にmessageキーの値としてhelloが保持されていることを示します。
次のJVMパラメータを指定して、YourFirstCoherenceApplicationを再実行します。出力は前回の実行と同じです。
-Dtangosol.coherence.distributed.localstorage=false
キャッシュ・サーバーおよびキャッシュ・クライアントのインスタンスをシャットダウンします。キャッシュ・サーバーを再起動してから、(前述のJVMパラメータを設定して)YourFirstCoherenceApplicationを再実行します。今回は出力がnullになります。
アプリケーションで(putメソッドを使用して)messageキーの値を変更した場合、新しい値はキャッシュ・クライアントで使用できますか。
たとえば、getメソッドをコメント・アウトしてputメソッドを追加します。
//String message = (String)myCache.get("message");
String message = (String)myCache.put("message", "bye");
YourFirstCoherenceApplicationを実行します。
キャッシュ・クライアントでgetコマンドを実行します。
Map (mycache): get message
出力としてbyeが表示されます。