オブジェクト・プール・マネージャー
オブジェクト・プール・マネージャーは、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.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() メソッドが呼び出されます。 このメソッドを使用することによって、オブジェクトを事前に初期化したり、クリーンアップしたりできます。
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) ファイルにパッケージ されるように配慮する必要があります。