본문 바로가기

Java

GenericObjectPool 메모

GenericObjectPool의 설정에 관한 메모이다. 
아래의 사이트에서 번역해 온 내용임을 밝힌다. 
누군가 벌써 해놨을지도 모르지만.. 
http://commons.apache.org/pool/apidocs/org/apache/commons/pool/impl/GenericObjectPool.html 

설정가능한 ObjectPool의 구현체

적절한 PoolableObjectFactory과 관련하여 GenericObjectPool은 
임의의 오브젝트에게 견고한 풀링을 기능적으로 제공한다. 

GenericObjectPool은 수많은 설정가능한 파라메터를 제공한다. 

* maxActive : 주어진 시간에서의 풀(클라이언트가 보고있거나, 대기상태에 있는)에 의해 할당되어 관리되는오브젝트의 최대수. 설정이 양수가 아닌경우에는 한번에 풀에서 관리될 수 있는 오브젝트의 숫자에는 제한이 없다. 오브젝트의 수가 maxActive에 다다른 경우, 풀은 고갈되었다라고 말한다. 기본 설정은 8이다. 

* maxIdle : 어떠한 시간에 풀에서 대기상태로 관리되어 질수 있는 최대 수이다. 음수인경우에는 풀에서 대기상태로 있는 오브젝트의 수에 제한이 없는것으로 간주한다. 기본설정은 8이다. 

* whenExhaustedAction : borrowObject() 실행시 풀이 고갈되었을때의 행동을 지정한다. 

* WHEN_EXHAUSTED_FAIL, borrowObject() 인경우 NoSuchElementExcption을 던질것이다.

* WHEN_EXHAUSTED_GROW, borrowObject() 인경우 새로운 오브젝트를 만들고 그것을 리턴한다. 
(근본적으로 maxActive가 의미가 없어진다. )

* WHEN_EXHAUSTED_BLOCK, borrowObject() 인경우 새 오브젝트혹은 대기오브젝트가 사용가능해 질때까지  블럭- Object.wait()를 호출 - 시킨다. maxWait값이 양수인경우 수 밀리세컨드동안 borrowObject()를 블럭시키고 그후에 
NoSuchElementException을 던지게 될것이다. maxWait가 음수라면 borrowObject()메서드는 영원히 블럭된다. (헐~)

* testOnBorrow가 설정되어 있으면, borrowObject()메서드를 통해 오브젝트를 리턴하기 전에 각각의 오브젝트의 유효성을 확인 하려고 할것이다.
(팩토리의 PoolableObjectFactory.validateObject(T) 메서드를 사용한다. ) 
유효성 체크에 실패하면 풀에서 그 오브젝트를 떨궈내고 다른 오브젝트를 빌려오게 될것이다. 기본설정은 false이다. 

* testOnReturn이 설정되어 있으면, returnObject(T)를 통해 풀에 오브젝트를 반환하려고 할때 
그 오브젝트의 유효성을 확인 하려고 할것이다. (팩토리의 PoolableObjectFactory.validateObject(T) 메서드를 사용한다.) 
유효성 체크에 실패하면 풀어세 떨궈낸다. 기본 설정은 false이다. 


옵션으로, 한가지 설정이 더있다. 풀에서 대기상태로 주저 앉아버린 오브젝트들을 쫓아낼 수 있는지 조사하기 위해 그리고 대기 오브젝트 수를 최소값이 되도록 보장하기위한 것이다. 이것은 한개의 'idle object eviction(대기 오부젝트 쫒아내기)' 스레드에
의해 수행되며, 비동기적으로 실행된다. 이 옵션을 설정할 경우는 주의해야한다. Eviction(오브젝트 쫓아내기)은 풀로 부터 오브젝트를 얻으려고하는 클라이언트 스레드와 다툴것이다. 그러므로 Eviction이 매우 빈번하게 일어난다면 성능상의 문제를 가져오게 될것이다. 대기 오브젝트를 쫓아내는 스레드는 아래의 어트리 뷰트들로 설정이 가능할것이다. (할것이다는 머임)

* timeBetweenEvictionRunsMillis : 대기 오브젝트를 쫓아내는 스레드가 "실행" 되기전에 얼마만큼 잠들어 있어야 되는지를 나타낸다. 음수로 되어있으면, 대기 오브젝트 쫓아내는 스레드는 올라오지 않는다. 디폴트 설정은 -1 이다. (즉 기본 설정은 사용안함이다.)

* minEvictableIdleTimeMills : 오브젝트가 풀에서 대기상태로 주저앉기 전에 idleTime에 의거해 쫓아 낼수 있는 최소 시간량을 명시한것이다. (시간제 피씨방, 만화방을 생각하면 되는건가.) 음수로 설정되어 있으면, idle time만으로는 어떤 오브젝트로 쫓아내지 않는다.  이 설정은 timeBetweenEvictionRunsMillis > 0 이 아니면 전혀 효과가 없다. 기본값은 30분이다. 

* testWhileIdle : 대기 오브젝트이든 아니든 팩토리의 PoolableObjectFactory.validateObject(T)에 의해
유효성을 체크하게된다. 유효성체크에 실패한 오브젝트는 풀에서 떨궈진다. 이 설정은 timeBetweenEvictionRunsMillis > 0 이 아니면 전혀 효과가 없다.디폴트 설정은 false이다. 

* softMinEvictableIdleTimeMills : 오브젝트가 풀에서 대기상태로 주저앉기 전에 대기오브젝트를 쫓아내는 스레드에 의해 쫓겨나게 되는 최소시간량을 몇시한다. 추가적인 조건으로 "minIdle"오브젝트의 인스턴스는 풀에 남아 있어야 된다. 음수로 설정되어 있으면 어떠한 오브젝트가 대기상태에 빠지더라도 쫓겨나지 않는다. timeBetweenEvictionRunsMillis > 0 이 아니면 이 설정은 무효다. 그리고 이 설정은 minEvictableIdleTimeMills가 유효한경우에는 무시된다. 디폴트 설정은 -1이다. (무효)

* numTestsPerEvictionRun : 대기 오브젝트를 쫓아내녀석(스레드)의 갯수. timeBetweenEvictionRunsMillis > 0 이 아니면 이 설정은 무효다. 기본값은 3이다.

대기 오브젝트를 존중해주려면, 풀은 LIFO큐로도 설정이 가능하다. 항상 가장 최근에 사용된 객체가 풀에서 부터 리턴된다. 또는 FIFO 큐는 풀의 가장 오래된 오브젝트 부터 빌려온다. 


* lifo : 대기 오브젝트이든 아니든 풀은 last-in-first-out으로 객체를 리턴한다. 디폴트는 true

GenericObjectPoll은 PoolableObjectFactory가 없다면 쓸모없다. null이 아닌 팩토리는 풀이 생성되기 전에 생성자의 인자 혹은 setFactory(org.apache.commons.poll.PoolableObjectFactory)로 제공되어 져야한다.