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

オブジェクト・プール・マネージャーは、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 オブジェクトをプールできます。
  • オブジェクトは、パブリック・デフォルト・コンストラクターを持つパブリック・クラスでなければなりません。
  • オブジェクトが java.util.Collection インターフェースを実装している場合は、オプションの clear() メソッドをサポートする必要があります。

プールされる各オブジェクト・クラスには、独自のオブジェクト・プールが必要です。さらに、アプリケーションは 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) ファイルにパッケージ されるように配慮する必要があります。


トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=casb_objectmanagers
ファイル名:casb_objectmanagers.html