Objektpoolmanager

Objektpoolmanager steuern die Wiederverwendung von Anwendungsobjekten und Developer-Kit-Objekten, z. B. Vektoren und HashMaps.

In der Zelle eines Anwendungsservers können mehrere Objektpoolmanager erstellt werden. Jeder Objektpoolmanager hat einen eindeutigen, in der gesamten Zelle gültigen JNDI-Namen (Java Naming and Directory Interface). Anwendungen können einen bestimmten Objektpoolmanager finden, indem Sie unter Angabe des speziellen JNDI-Namens ein JNDI-Lookup ausführen.

Der Objektpoolmanager und seine zugehörigen Objekte implementieren die folgenden Schnittstellen:
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);
	
}

Die Methode "getObject()" entfernt das Objekt aus dem Objektpool. Wenn ein Aufruf von getObject() abgesetzt wird und der Pool leer ist, wird ein Objekt desselben Typs erstellt. Ein Aufruf von returnObject() stellt das Objekt in den Objektpool zurück. Wenn returnObject() nicht aufgerufen wird, kann das Objekt nicht mehr aus dem Objektpool zugeordnet werden. Wenn das Objekt nicht an den Objektpool zurückgegeben wird, kann es von der Garbage-Collection erfasst werden.

Mit einem Objektpoolmanager kann jedes Java-Objekt mit den folgenden Merkmalen im Pool verwaltet werden:
  • Das Objekt muss eine öffentliche Klasse (public class) mit einem öffentlichen (public) Standardkonstruktor sein.
  • Wenn das Objekt die Schnittstelle "java.util.Collection" implementiert, muss es die optional Methode "clear()" unterstützen.

Jede Objektklasse, die in einem Pool verwaltet werden soll, muss einen eigenen Objektpool besitzen. Außerdem kann eine Anwendung mit der Methode "ObjectPoolManager.getPool()" oder mit der Methode "ObjectPoolManager.createFastPool()" einen Objektpool für ein bestimmtes Objekt abrufen. Der Unterschied zwischen diesen beiden Methoden besteht darin, dass die Methode "getPool()" einen Pool zurückgibt, der von mehreren Threads gemeinsam benutzt werden kann. Die Methode "createFastPool()" gibt einen Pool zurück, der nur von einem einzelnen Thread verwendet werden kann.

Falls in einer JVM (Java Virtual Machine) die Methode "getPool()" mehrmals für eine Klasse aufgerufen wird, wird derselbe Pool zurückgegeben. Wird die Methode "createFastPool()" aufgerufen, dann wird für jeden Aufruf ein neuer Pool zurückgegeben. Im Wesentlichen liefert die Methode "getPool()" einen Pool mit Threadsynchronisation.

Der Pool, der von mehreren Threads verwendet werden soll, ist aufgrund der Threadsynchronisation etwas langsamer als der schnelle Pool. Allerdings müssen Sie bei Verwendung des schnellen Pools sehr vorsichtig vorgehen.

Angenommen, die folgende Schnittstelle ist vorhanden:
public interface PoolableObject 
{
		void init();
		void returned();
}

Falls die Objekte im Pool diese Schnittstelle implementieren und die Methode "ObjectPool.getObject()" aufgerufen wird, wird für das vom Pool verteilte Objekt die Methode "init()" aufgerufen. Beim Aufruf der Methode "ObjectPool.returnObject()" wird die Methode "PoolableObject.returned()" für das Objekt aufgerufen, bevor es an den Objektpool zurückgegeben wird. Auf diese Weise ist es möglich, Objekte vorab zu initialisieren oder zu bereinigen.

Es ist einem Objekt nicht immer möglich, PoolableObject zu implementieren. Beispielsweise kann es vorkommen, dass eine Anwendung ArrayList-Objekte im Pool verwalten möchte. Der Inhalt des ArrayList-Objekts muss jedes Mal, wenn es von der Anwendung wieder verwendet wird, gelöscht werden. Die Anwendung kann das ArrayList-Objekt erweitern und das ArrayList-Objekt ein poolfähiges Objekt implementieren lassen. Beachten Sie z. B. Folgendes:
public class PooledArrayList extends ArrayList implements PoolableObject 
{
		public PooledArrayList()
	{
	}
	
		public void init() {
	}

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

Falls die Anwendung dieses Objekt anstelle eines echten ArrayList-Objekts verwendet, wird der Inhalt des ArrayList-Objekts automatisch gelöscht, wenn es an den Pool zurückgegeben wird.

Beachten Sie, dass beim Löschen des ArrayList-Objekts dieses lediglich als leer gekennzeichnet wird. Der zugehörige Sicherungs-Array des ArrayList-Objekts wird nicht gelöscht. Während die Anwendung die ArrayList wiederholt verwendet, wird der zugehörige Sicherungs-Array folglich so lange erweitert, bis er groß genug ist, um alle Anforderungen der Anwendung zu erfüllen. Wenn dieser Punkt erreicht ist, werden keine weiteren Sicherungs-Arrays zugeordnet und kopiert, und die optimale Leistung wird erzielt.

Eventuell ist es nicht möglich oder nicht wünschenswert, die oben beschriebene Vorgehensweise zu verwenden. Alternativ dazu kann ein angepasster Objektpool implementiert werden, der anschließend beim Objektpoolmanager als der Pool registriert wird, der für Klassen dieses Typs verwendet werden soll. Die Klasse wird vom WebSphere-Administrator registriert, wenn der Objektpoolmanager in der Zelle definiert wird. Dabei sollte darauf geachtet werden, dass diese Klassen in JAR-Dateien (Java-Archiv) gepackt sind, die auf allen Knoten in der Zelle, in denen sie verwendet werden können, verfügbar sind.


Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=casb_objectmanagers
Dateiname:casb_objectmanagers.html