WebSphere Application Server - Express, Version 6.1   
             オペレーティング・システム: AIX , HP-UX, Linux, Solaris, Windows, Windows Vista

             目次と検索結果のパーソナライズ化

オブジェクト・プール・マネージャー

オブジェクト・プール・マネージャーは、Vectors や HashMaps などのアプリケーション・オブジェクトと Developer Kit オブジェクトの再利用を制御します。

複数のオブジェクト・プール・マネージャーを 1 つのアプリケーション・サーバー・セル内に作成できます。各オブジェクト・プール・マネージャーは、セル全体で固有の Java Naming and Directory Interface (JNDI) 名を持ちます。アプリケーションは、特定の JNDI 名を使用して JNDI ルックアップを行うことにより、 特定のオブジェクト・プール・マネージャーを検出できます。

オブジェクト・プール・マネージャーおよびその関連オブジェクトは、以下のインターフェースをインプリメントします。
public interface ObjectPoolManager
{
	ObjectPool getPool(Class aClass)
		throws InstantiationException, IllegalAccessException;
	ObjectPool createFastPool(Class aClass)
		throws InstantiationException, IllegalAccessException;
		
}

public interface ObjectPool
{
	Object getObject();
	void returnObject(Object o);
	
}

getObject() メソッドは、オブジェクト・プールからこのオブジェクトを除去します。getObject() 呼び出しが 作成され、プールが空の場合、同じタイプのオブジェクトが作成されます。 returnObject( ) 呼び出しは、このオブジェクトをオブジェクト・プールに戻します。returnObject() が 呼び出されない場合、このオブジェクトはオブジェクト・プールから割り振ることはできなくなります。 オブジェクトがオブジェクト・プールに戻されない場合、ガーベッジ・コレクションが行われます。

各オブジェクト・プール・マネージャーを使用して、以下の特性を持つ任意の Java オブジェクトをプールできます。

プールされる各オブジェクト・クラスには、独自のオブジェクト・プールが必要です。さらに、アプリケーションは ObjectPoolManager.getPool() メソッドまたは ObjectPoolManager.createFastPool() メソッドのいずれかを使用して、特定のオブジェクト用のオブジェクト・プールを取得します。 これらのメソッドの違いとして、getPool() メソッドは、複数のスレッド間で共用できるプールを戻す、という点が挙げられます。 これに対し、createFastPool() メソッドは、単一のスレッドのみが使用できるプールを戻します。

Java 仮想マシン (JVM) で、getPool() メソッドが単一クラスに対して複数回呼び出される場合、同じプールが戻されます。 新規プールは、createFastPool() メソッドが呼び出される際に、それぞれの呼び出しごとに戻されます。 基本的に、getPool() メソッドはスレッド同期のプールを戻します。

複数のスレッドが使用するプールは、スレッド同期化を処理する必要があるため、 高速プールよりもわずかに遅くなります。ただし、高速プールを使用する場合は厳重な注意が必要です。 以下のインターフェースを考慮してください。
public interface PoolableObject 
{
	void init();
	void returned();
}

プールに配置されているオブジェクトがこのインターフェースをインプリメントしており、ObjectPool.getObject() メソッドが呼び出された場合は、プールが配布するオブジェクトの init() メソッドが呼び出されます。ObjectPool.returnObject() メソッドが呼び出されると、オブジェクトがオブジェクト・プールへ戻される前に、そのオブジェクトの PoolableObject.returned() メソッドが呼び出されます。 このメソッドを使用することによって、オブジェクトを事前に初期化したり、クリーンアップしたりできます。

オブジェクトが常に PoolableObject をインプリメントできるとは限りません。 例えば、 アプリケーションが ArrayList オブジェクトをプールするとします。 ArrayList オブジェクトは、アプリケーションで再利用するたびにクリアする必要があります。 アプリケーションは、ArrayList オブジェクトを拡張して、プール可能なオブジェクトを ArrayList オブジェクトによってインプリメントすることができます。 例えば、次の例について考えてみます。
public class PooledArrayList extends ArrayList implements PoolableObject 
{
	public PooledArrayList()
	{
	}
	
	public void init() {
	}

	public void returned() 
	{
		clear();
	}
}

アプリケーションが実際の ArrayList オブジェクトの代わりにこのオブジェクトを使用する場合、ArrayList は、 プールへ戻される際に自動的にクリアされます。

ArrayList オブジェクトをクリアした場合、単に空とマークされるだけです。 ArrayList オブジェクトをバッキングする配列は、空にはなりません。したがって、アプリケーションが ArrayList を再利用するとき、 バッキング配列はすべてのアプリケーション要件に対して十分なサイズになるまで拡張されます。 このポイントに達すると、アプリケーションは新規のバッキング配列の割り振りとコピーを停止し、最高のパフォーマンスが実現されます。

上記のメカニズムは、使用できなかったり、使用が望ましくない場合があります。 代替方法として、カスタム・オブジェクト・プールをインプリメントし、 このプールをオブジェクト・プール・マネージャーに、そのタイプのクラス用に使用するプールとして登録することができます。クラスは、オブジェクト・プール・マネージャーがセルに定義されるときに、WebSphere 管理者によって登録されます。 これらのクラスは、Java Archive (JAR) ファイルにパッケージして、これらのクラスが使用される可能性のあるセル内のすべてのノードで使用できるように配慮する必要があります。




関連タスク
オブジェクト・プールの使用
概念トピック    

ご利用条件 | フィードバック

最終更新: Jan 21, 2008 6:25:35 PM EST
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/asyncbns/concepts/casb_objectmanagers.html