오브젝트 풀 관리자
오브젝트 풀 관리자는 Vectors와 HashMaps와 같은 애플리케이션 오브젝트와 개발자 킷 오브젝트의 재사용을 제어합니다.
애플리케이션 서버 셀에서 복수 오브젝트 풀 관리자가 작성될 수 있습니다.각 오브젝트 풀 관리자는 고유 셀 전체 JNDI(Java™ Naming and Directory Interface) 이름이 있습니다. 애플리케이션은 특정 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() 메소드는 단일 스레드에서만 사용될 수 있는 풀을 리턴합니다.
JVM(Java virtual machine)에서 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® 관리자가 클래스를 등록합니다. 이 클래스가 사용될 수 있는 셀의 모든 노드에서 사용 가능한 JAR(Java Archive) 파일로 패키지됩니다.