この章では、既存のOracle Coherenceドキュメント・ライブラリ(『Oracle Coherenceスタート・ガイド』、『Oracle Coherence開発者ガイド』および『Oracle Coherenceユーザーズ・ガイド』)への変更、追加および修正の内容について説明します。Oracle Coherenceの最新ドキュメント・ライブラリは、次のURLで入手できます。
http://download.oracle.com/docs/cd/E13924_01/index.htm
この項では、『Oracle Coherenceスタート・ガイド』の「インプリメンタの概要」の章に対する変更について説明します。
表2-1は、「キャッシュの問合せ」の項の例8-1および8-2に対するコードの変更を示しています。この表の中で、文章の変更箇所は「」で、コードの変更箇所はイタリック文字で、それぞれ示されています。
表2-1 「キャッシュの問合せ」の項に対する変更
『Oracle Coherenceスタート・ガイド』の「Coherenceのエディション別機能」の付録で、注意6のテキストが変更されています。
この項では、『Oracle Coherenceユーザーズ・ガイド』の「Coherence C++オブジェクト・モデルについて」の章に対する変更について説明します。修正された記述は「」で示されています。
表2-3は、「スレッド・セーフティ」の項に対する変更を示しています。
表2-3 「スレッド・セーフティ」の項の記述に対する変更
変更前の記述 | 変更後の記述 |
---|---|
オブジェクト・モデルにはスレッドセーフな参照カウントが含まれていますが、これによって派生クラスの状態に対するスレッド・セーフティが自動的に実現するわけではありません。多くの場合と同様、より高いレベルのスレッドセーフティを実現できるかどうかは、個々のクラスの実装にかかっています。より高いレベルのスレッドセーフティが存在するかどうかにかかわらず、参照カウントはスレッドセーフな状態で維持できます。 |
「ベース・オブジェクト・クラスはスレッドセーフですが、」これによって派生クラスの状態に対するスレッド・セーフティが自動的に実現「できる」わけではありません。多くの場合と同様、より高いレベルのスレッドセーフティを実現できるかどうかは、個々の「派生」クラスの実装にかかっています。「オブジェクト・モデルは、スレッドセーフなコードを作成するための機能をいくつか備えています。」 |
表2-4は、「スレッド・セーフなハンドル」の項に対する変更を示しています。
表2-4 「スレッド・セーフなハンドル」の項に対する変更
変更前の記述 | 変更後の記述 |
---|---|
管理クラスに定義されている、ネストしたタイプのHandle、ViewおよびHolderは「スレッドセーフではありません」。つまり、複数のスレッドで1つの同じハンドルを使用している場合、そのスレッドのいずれかでこの1つのハンドルを変更して別のオブジェクトを参照する可能性があれば、これは安全な状態ではありません。ここで扱っているスレッドセーフティはハンドルに関するものであり、そのハンドルで参照するオブジェクトに関するものではない点を明確に理解しておくことが重要です。別々のスレッドからそれぞれ個別のハンドルを使用し、同期処理をせずに同じオブジェクトを参照することは安全です。 |
管理クラスに定義されている、ネストしたタイプのHandle、ViewおよびHolderは「意図的にスレッドセーフにはなっていません」。つまり、「複数のスレッドが1つのハンドルを共有することは安全ではありません」。ここで扱っているスレッドセーフティはハンドルに関するものであり、そのハンドルで参照するオブジェクトに関するものではない点を明確に理解しておくことが重要です。別々のスレッドからそれぞれ個別のハンドルを使用し、同期処理をせずに同じオブジェクトを参照することは安全です。 |
これらのタイプのハンドルをスレッドセーフティとしていないことから、ハンドルの大部分をスタックに割り当てることを前提として、パフォーマンスを大幅に最適化できます。スタックに割り当てたこれらのハンドルに対する参照を複数のスレッドで共有しないかぎり、スレッドセーフティに関する問題の発生を考慮する必要はなくなります。多くの場合、次のいずれかの条件でハンドルを共有する場合は注意が必要です。
|
これらのタイプのハンドルをスレッドセーフティとしていないことから、ハンドルの「大部分がスタックに割り当てられるので」、パフォーマンスを大幅に最適化できます。スタックに割り当てたこれらのハンドルに対する参照を複数のスレッドで共有しないかぎり、スレッドセーフティに関する問題の発生を考慮する必要はなくなります。 1つのハンドルを複数のスレッドで参照する可能性がある場合は、スレッドセーフなハンドルが必ず必要になります。一般的には次のような状況が考えられます。
|
最初の状況では最適化の手段が用意されています。つまり、次の特別なスレッドセーフなハンドルを使用します。
|
このような場合は、標準ハンドルのかわりにスレッドセーフなハンドルを使用します。オブジェクト・モデルには次のようなスレッドセーフなハンドルが用意されています。
|
これらのハンドル・タイプは、さらに同期化を実行しなくても、複数のスレッドで読取りおよび書込みを行えます。これらは主に、他の管理クラスのデータ・メンバーとして使用されており、親タイプの内部的なアトミック状態を利用してスレッド・セーフティを実現します。これらのハンドル・タイプをコード・ブロック内で複数回アクセスする場合は、通常のスタック・ベース・ハンドルに読み取って使用することをお薦めします。この通常のスタック・ベース・ハンドルへの割当てはスレッドセーフであるため、割当てが完了すれば、基本的にはスタック・ベース・ハンドルの参照解除を自由に行えます。スレッドセーフなハンドルを初期化する場合は、最初のパラメータとしてガーディアン・オブジェクトへの参照を指定する必要があります。この参照は、包含するオブジェクトに対して |
これらのハンドル・タイプは、さらに同期化を実行しなくても、複数のスレッドで読取りおよび書込みを行えます。これらは主に、他の管理クラスのデータ・メンバーとして使用されており、「各インスタンスにはガーディアン管理オブジェクトへの参照が提供されます。ガーディアンの内部的でスレッドセーフなアトミック状態を利用してハンドルのスレッド・セーフティを実現します」。これらのハンドル・タイプをコード・ブロック内で複数回アクセスする場合は、通常のスタック・ベース・ハンドルに読み取って使用することをお薦めします。この「標準」のスタック・ベース・ハンドルへの割当てはスレッドセーフであるため、割当てが完了すれば、基本的にはスタック・ベース・ハンドルの参照解除を自由に行えます。スレッドセーフなハンドルを初期化する場合は、最初のパラメータとしてガーディアン・オブジェクトへの参照を指定する必要があります。この参照は、包含するオブジェクトに対して |
非管理クラスにも同じ手法を適用できます。非管理クラスは、 |
非管理クラスにも同じ手法を適用できます。非管理クラスは、 管理クラスを作成するときは、 |
該当なし |
次の注意を例2-18の前に追加します。 「注意: まれな状況として、 |
表2-5は、「メモリー・リークの検出」の項に対する変更を示しています。
この項では、『Oracle Coherenceユーザーズ・ガイド』の「C++クライアント向け統合オブジェクトの構築」の章に対する変更について説明します。
表2-6は、この章の概要に対する変更を示しています。修正された記述は「」で示されています。
表2-6 「C++クライアント向け統合オブジェクトの構築」の概要に対する変更
変更前の記述 | 変更後の記述 |
---|---|
C++クライアントを有効にしてCoherenceクラスタ内にC++ベースのオブジェクトを適切に格納するには、POF(Portable Object Format)と呼ばれる、プラットフォームに依存しないシリアライズ・フォーマットを使用する必要があります。POFを使用すると、値オブジェクトの作成元であるプラットフォームや言語との関係を持たない形態で、その値オブジェクトをバイナリ・ストリームにエンコードできます。 |
C++クライアントを有効にしてCoherenceクラスタ内にC++ベースのオブジェクトを適切に格納するには、POF(Portable Object Format)と呼ばれる、プラットフォームに依存しないシリアライズ・フォーマットを使用する必要があります。POFを使用すると、値オブジェクトの作成元であるプラットフォームや言語との関係を持たない形態で、その値オブジェクトをバイナリ・ストリームにエンコードできます。「その後は、類似のPOFベースのクラス定義を使用して、そのストリームを代替言語でデシリアライズできます。」 |
新しい項「POFに固有の内容」が「C++クライアント向け統合オブジェクトの構築」の章に追加されました。
POFに固有の内容
POFでは次のタイプが内部的にサポートされていますが、ユーザー側で特別な取扱いをする必要はありません。
文字列
Integer16、Integer64
Float32、Float64
プリミティブの配列<>
ObjectArray
ブール
オクテット
Character16
さらに、次の一般的なインタフェースを実装するクラスには自動POFシリアライズが提供されます。
マップ
コレクション
例外
「PofSerializer(外部シリアライズ)」の項の例3-6が修正されました。修正されたコードは、太字イタリックで示されています。
#include "coherence/lang.ns" using namespace coherence::lang; class Address : public cloneable_spec<Address> // extends<Object> is implied { friend class factory<Address>; protected: // constructors Address(String::View vsCity, String::View vsState, int32_t nZip): m_vsCity(self(), vsCity), m_vsState(self(), vsState), m_nZip(nZip) {}
Address(const Address& that): super(that), m_vsCity(self(), that.m_vsCity), m_sState(self(), that.m_vsState), m_nZip(that.m_nZip) {}
public: // Address interface virtual String::View getCity() const {return m_vsCity;} virtual String::View getState() const {return m_vsState;} virtual int32_t getZip() const {return m_nZip;} public: // Object interface virtual bool equals(Object::View that) const { if (instanceof<Address::View>(that)) { Address::View vThat = cast<Address::View>(that); return getZip() == vThat->getZip() && Object::equals(getState(), vThat->getState()) && Object::equals(getCity(), vThat->getCity()); } return false; } virtual size32_t hashCode() const { return (size32_t) m_nZip; } virtual void toStream(std::ostream& out) const { out << getCity() << ", " << getState() << " " << getZip(); } private:const MemberView<String> m_vsCity;
const MemberView<String> m_vsState;
const int32_t m_nZip; };
表2-7は、「Javaクラスの必要性」の項に対する変更を示しています。修正された記述は「」で示されています。
表2-7 「Javaクラスの必要性」の項に対する変更
変更前の記述 | 変更後の記述 |
---|---|
前述のアプローチのいずれかを完了すると、Coherenceクラスタにデータ・オブジェクトを保存できるようになります。これにより、オブジェクトで |
前述のアプローチのいずれかを完了すると、Coherenceクラスタにデータ・オブジェクトを保存できるようになります。「これだけでも、」オブジェクトで |
この項では、『Oracle Coherence開発者ガイド』の「JMXを使用したCoherenceの管理方法」の章に対する変更について説明します。
表2-8は、「Coherenceの管理フレームワークの構成」の項に対する変更を示しています。変更された記述は「」で示されています。
表2-8 「Coherenceの管理フレームワークの構成」の項に対する変更
変更前の記述 | 変更後の記述 |
---|---|
専用のJMXクラスタ・メンバーの使用はよく見られる手法です。この手法では、単独のクラスタ・メンバーごとにJMXソフトウェアをロードする必要がありませんが、フォルト・トレランスを引き続き提供することで、個々のJMXメンバーで問題が発生します。 |
専用のJMXクラスタ・メンバーの使用はよく見られる手法です。この手法では、単独のクラスタ・メンバーごとにJMXソフトウェアをロードする必要がありませんが、フォルト・トレランスを引き続き提供することで、個々のJMXメンバーで問題が発生します。「MBeanServerホストとして機能していないノードに対して |
この項では、『Oracle Coherence開発者ガイド』の「本番チェックリスト」の付録に対する変更について説明します。
表2-9は、「JVM」の項に対する変更を示しています。新しい記述は「」で示されています。
表2-9 「JVM」の項に対する変更
変更前の記述 | 変更後の記述 |
---|---|
使用しているプラットフォームとCoherenceのバージョンに基づき、サポートされている最新のSun JVMを使用して、テストおよびデプロイを実施することをお薦めします。 |
使用しているプラットフォームとCoherenceのバージョンに基づき、サポートされている最新のSun JVMを使用して、テストおよびデプロイを実施することをお薦めします。「バージョン1.5以降のJVMでCoherenceを実行すると、1.5より古いバージョンのJVMで実行した場合と比較して、パフォーマンスが大幅に向上することが確認されています。」 |
表2-10は、「Coherenceのキャッシュ構成」の項に対する変更を示しています。修正された記述は「」で示されています。
表2-10 「Coherenceキャッシュ構成」の項に対する変更
変更前の記述 | 変更後の記述 |
---|---|
明示的な指定がないかぎり、すべてのクラスタ・ノードはストレージ対応であり、つまりキャッシュ・サーバーとして機能します。本番環境の中でどのノードをストレージ対応とし、どのノードをストレージ非対応とするかを管理することは重要です。 |
明示的な指定がないかぎり、すべてのクラスタ・ノードはストレージ対応であり、つまりキャッシュ・サーバーとして機能します。本番環境の中でどのノードをストレージ対応とし、どのノードをストレージ非対応とするかを管理することは重要です。 |