WEB개발

[Apache Common] Generic Object Pool

wooyeon06 2024. 4. 3. 10:34

 

 이 클래스는 객체 풀링(Object Pooling)을 구현하는 데 사용됩니다. 객체 풀링은 애플리케이션에서 자주 사용되는 객체를 미리 생성하고 관리하여 성능을 향상시키는 기법 중 하나입니다.

 

GenericObjectPool은 제네릭으로 구현되어 다양한 종류의 객체를 풀링할 수 있습니다. 객체 풀링은 일반적으로 네트워크 연결, 데이터베이스 연결, 스레드 등과 같이 생성 및 소멸 비용이 높은 객체를 관리할 때 사용됩니다.

 

 

Eviction Thread는 객체 풀에서 사용되지 않는(유휴 상태의) 객체들을 주기적으로 제거하는 역할을 수행하는 백그라운드 스레드입니다.

 

Abandoned objects(유실된 객체)는 애플리케이션에서 객체를 풀에서 가져왔지만, 해당 객체를 반환하지 않고 그대로 버린 경우를 가리킵니다.

 

Idle objects(유휴 객체)는 현재 사용되고 있지 않지만 풀에 남아 있는 객체를 가리킵니다. 이러한 객체들은 사용되지 않는 상태로 풀에 유지되고 있으며, 필요할 때 언제든지 사용할 수 있도록 대기하고 있습니다.

 

Active objects(활성 객체)는 현재 사용 중인 객체를 가리킵니다. 이러한 객체들은 애플리케이션에서 사용 중이며, 객체 풀에서 가져와 사용되고 있는 상태입니다.

 

 

 

 

파라미터 (parameter)

 

maxActive
(defulat : 8)
할당되어 관리되는오브젝트의 최대수
maxIdle
(defulat : 8)
어떠한 시간에 풀에서 대기상태로 관리되어 질수 있는 최대 수이다.

음수인경우에는 풀에서 대기상태로 있는 오브젝트의 수에 제한이 없는것으로 간주한다.
WHEN_EXHAUSTED_ACTION  borrowObject() 실행시 풀이 고갈되었을때의 행동을 지정한다. 
WHEN_EXHAUSTED_FAIL  borrowObject() 인경우 NoSuchElementExcption을 던질것이다.
WHEN_EXHAUSTED_GROW  borrowObject() 인경우 새로운 오브젝트를 만들고 그것을 리턴한다.
(근본적으로 maxActive가 의미가 없어진다. )
WHEN_EXHAUSTED_BLOCK  borrowObject() 인경우 새 오브젝트혹은 대기오브젝트가 사용가능해 질때까지  블럭- Object.wait()를 호출시킨다.

maxWait값이 양수인경우 수 밀리세컨드동안 borrowObject()를 블럭시키고 그후에 NoSuchElementException을 던지게 될것이다.

maxWait가 음수라면 borrowObject()메서드는 영원히 블럭된다. 
testOnBorrow
(default : false)
borrowObject()메서드를 통해 오브젝트를 리턴하기 전에 각각의 오브젝트의 유효성을 확인 하려고 할것이다.
(팩토리의 PoolableObjectFactory.validateObject(T) 메서드를 사용한다. ) 
testOnReturn
(default : false)
 returnObject(T)를 통해 풀에 오브젝트를 반환하려고 할때 그 오브젝트의 유효성을 확인 하려고 할것이다.
(팩토리의 PoolableObjectFactory.validateObject(T) 메서드를 사용한다.) 
timeBetweenEvictionRunsMillis (default : -1) 대기 오브젝트를 쫓아내는 스레드가 "실행" 되기전에 얼마만큼 잠들어 있어야 되는지를 나타낸다. 음수로 되어있으면, 대기 오브젝트 쫓아내는 스레드는 올라오지 않는다. 
minEvictableIdleTimeMills
(default : 30)
오브젝트가 풀에서 대기상태로 주저앉기 전에 idleTime에 의거해 쫓아 낼수 있는 최소 시간량을 명시한것이다. 음수로 설정되어 있으면, idle time만으로는 어떤 오브젝트로 쫓아내지 않는다.  이 설정은 timeBetweenEvictionRunsMillis > 0 이 아니면 전혀 효과가 없다. 
testWhileIdle
(default : false)
: 대기 오브젝트이든 아니든 팩토리의 PoolableObjectFactory.validateObject(T)에 의해
유효성을 체크하게된다. 
유효성체크에 실패한 오브젝트는 풀에서 떨궈진다.
 이 설정
은 timeBetweenEvictionRunsMillis > 0 이 아니면 전혀 효과가 없다.
softMinEvictableIdleTimeMills  (default : -1) 오브젝트가 풀에서 대기상태로 주저앉기 전에 대기오브젝트를 쫓아내는 스레드에 의해 쫓겨나게 되는 최소시간량을 몇시한다.

추가적인 조건으로 "minIdle"오브젝트의 인스턴스는 풀에 남아 있어야 된다. 음수로 설정되어 있으면 어떠한 오브젝트가 대기상태에 빠지더라도 쫓겨나지 않는다.
timeBetweenEvictionRunsMillis > 0 이 아니면 이 설정은 무효다.
그리고 이 설정은 minEvictableIdleTimeMills가 유효한경우에는 무시된다. 
numTestsPerEvictionRun
(default : 3)

대기 오브젝트를 쫓아내녀석(스레드)의 갯수. timeBetweenEvictionRunsMillis > 0 이 아니면 이 설정은 무효다. 
lifo
(default : true)
대기 오브젝트이든 아니든 풀은 last-in-first-out으로 객체를 리턴한다.  false는 fifo

 

 

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.PooledObject;

public class Main {
    public static void main(String[] args) throws Exception {
        // 객체 풀 생성
        GenericObjectPool<String> objectPool = new GenericObjectPool<>(new StringFactory());

        // 객체를 풀에서 가져와 사용
        String obj1 = objectPool.borrowObject();
        System.out.println("Object 1: " + obj1);

        // 객체를 풀에 반환
        objectPool.returnObject(obj1);

        // 다시 객체를 풀에서 가져와 사용
        String obj2 = objectPool.borrowObject();
        System.out.println("Object 2: " + obj2);

        // 풀 사용이 끝나면 반드시 닫아줘야 함
        objectPool.close();
    }

    // 객체를 생성하는 팩토리 클래스 정의
    static class StringFactory extends BasePooledObjectFactory<String> {
        @Override
        public String create() throws Exception {
            return "Hello, World!";
        }

        @Override
        public PooledObject<String> wrap(String obj) {
            return new DefaultPooledObject<>(obj);
        }

        @Override
        public void passivateObject(PooledObject<String> pooledObject) throws Exception {
            // 객체를 풀에 반환하기 전에 초기화 등의 작업 수행 가능
            super.passivateObject(pooledObject);
        }
    }
}

 

 

 

 

 


https://godpage.tistory.com/entry/GenericObjectPool-메모