dirkv 2004/08/10 12:39:37 Modified: pool/src/java/org/apache/commons/pool/impl GenericObjectPool.java Log: Bugzilla Bug 30426: [pool] need property for removing objects above min - applied patch from David Rosenstark (with some cleanups) Revision Changes Path 1.35 +77 -4 jakarta-commons/pool/src/java/org/apache/commons/pool/impl/GenericObjectPool.java Index: GenericObjectPool.java =================================================================== RCS file: /home/cvs/jakarta-commons/pool/src/java/org/apache/commons/pool/impl/GenericObjectPool.java,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- GenericObjectPool.java 4 Jul 2004 17:28:19 -0000 1.34 +++ GenericObjectPool.java 10 Aug 2004 19:39:36 -0000 1.35 @@ -249,6 +249,13 @@ */ public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L; + /** + * The default value for [EMAIL PROTECTED] #getSoftMinEvictableIdleTimeMillis}. + * @see #getSoftMinEvictableIdleTimeMillis + * @see #setSoftMinEvictableIdleTimeMillis + */ + public static final long DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS = -1; + //--- constructors ----------------------------------------------- /** @@ -368,6 +375,26 @@ * @param testWhileIdle whether or not to validate objects in the idle object eviction thread, if any (see [EMAIL PROTECTED] #setTestWhileIdle}) */ public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle) { + this(factory, maxActive, whenExhaustedAction, maxWait, maxIdle, DEFAULT_MIN_IDLE, testOnBorrow, testOnReturn, timeBetweenEvictionRunsMillis, numTestsPerEvictionRun, minEvictableIdleTimeMillis, testWhileIdle, DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS); + } + + /** + * Create a new <tt>GenericObjectPool</tt> using the specified values. + * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects + * @param maxActive the maximum number of objects that can be borrowed from me at one time (see [EMAIL PROTECTED] #setMaxActive}) + * @param whenExhaustedAction the action to take when the pool is exhausted (see [EMAIL PROTECTED] #setWhenExhaustedAction}) + * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted an and <i>whenExhaustedAction</i> is [EMAIL PROTECTED] #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see [EMAIL PROTECTED] #setMaxWait}) + * @param maxIdle the maximum number of idle objects in my pool (see [EMAIL PROTECTED] #setMaxIdle}) + * @param minIdle the minimum number of idle objects in my pool (see [EMAIL PROTECTED] #setMinIdle}) + * @param testOnBorrow whether or not to validate objects before they are returned by the [EMAIL PROTECTED] #borrowObject} method (see [EMAIL PROTECTED] #setTestOnBorrow}) + * @param testOnReturn whether or not to validate objects after they are returned to the [EMAIL PROTECTED] #returnObject} method (see [EMAIL PROTECTED] #setTestOnReturn}) + * @param timeBetweenEvictionRunsMillis the amount of time (in milliseconds) to sleep between examining idle objects for eviction (see [EMAIL PROTECTED] #setTimeBetweenEvictionRunsMillis}) + * @param numTestsPerEvictionRun the number of idle objects to examine per run within the idle object eviction thread (if any) (see [EMAIL PROTECTED] #setNumTestsPerEvictionRun}) + * @param minEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the pool before it is eligable for evcition (see [EMAIL PROTECTED] #setMinEvictableIdleTimeMillis}) + * @param testWhileIdle whether or not to validate objects in the idle object eviction thread, if any (see [EMAIL PROTECTED] #setTestWhileIdle}) + * @param softMinEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the pool before it is eligable for evcition with the extra condition that at least "minIdle" amount of object remain in the pool. (see [EMAIL PROTECTED] #setSoftMinEvictableIdleTimeMillis}) + */ + public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle, long softMinEvictableIdleTimeMillis) { _factory = factory; _maxActive = maxActive; switch(whenExhaustedAction) { @@ -387,6 +414,7 @@ _timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; _numTestsPerEvictionRun = numTestsPerEvictionRun; _minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + _softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis; _testWhileIdle = testWhileIdle; _pool = new CursorableLinkedList(); @@ -666,6 +694,32 @@ } /** + * Returns the minimum amount of time an object may sit idle in the pool + * before it is eligable for eviction by the idle object evictor + * (if any), with the extra condition that at least + * "minIdle" amount of object remain in the pool. + * + * @see #setSoftMinEvictableIdleTimeMillis + */ + public synchronized long getSoftMinEvictableIdleTimeMillis() { + return _softMinEvictableIdleTimeMillis; + } + + /** + * Sets the minimum amount of time an object may sit idle in the pool + * before it is eligable for eviction by the idle object evictor + * (if any), with the extra condition that at least + * "minIdle" amount of object remain in the pool. + * When non-positive, no objects will be evicted from the pool + * due to idle time alone. + * + * @see #getSoftMinEvictableIdleTimeMillis + */ + public synchronized void setSoftMinEvictableIdleTimeMillis(long softMinEvictableIdleTimeMillis) { + _softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis; + } + + /** * When <tt>true</tt>, objects will be * [EMAIL PROTECTED] PoolableObjectFactory#validateObject validated} * by the idle object evictor (if any). If an object @@ -927,9 +981,14 @@ } else { boolean removeObject = false; ObjectTimestampPair pair = (ObjectTimestampPair)(_evictionCursor.previous()); - if(_minEvictableIdleTimeMillis > 0 && - System.currentTimeMillis() - pair.tstamp > _minEvictableIdleTimeMillis) { - removeObject = true; + long idleTimeMilis = System.currentTimeMillis() - pair.tstamp; + if ((_minEvictableIdleTimeMillis > 0) + && (idleTimeMilis > _minEvictableIdleTimeMillis)) { + removeObject = true; + } else if ((_softMinEvictableIdleTimeMillis > 0) + && (idleTimeMilis > _softMinEvictableIdleTimeMillis) + && (getNumIdle() > getMinIdle())) { + removeObject = true; } else if(_testWhileIdle) { boolean active = false; try { @@ -1120,6 +1179,7 @@ public long timeBetweenEvictionRunsMillis = GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; public int numTestsPerEvictionRun = GenericObjectPool.DEFAULT_NUM_TESTS_PER_EVICTION_RUN; public long minEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + public long softMinEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; } //--- private attributes --------------------------------------- @@ -1253,6 +1313,19 @@ * @see #setTimeBetweenEvictionRunsMillis */ private long _minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + + /** + * The minimum amount of time an object may sit idle in the pool + * before it is eligable for eviction by the idle object evictor + * (if any), with the extra condition that at least + * "minIdle" amount of object remain in the pool. + * When non-positive, no objects will be evicted from the pool + * due to idle time alone. + * + * @see #setSoftMinEvictableIdleTimeMillis + * @see #getSoftMinEvictableIdleTimeMillis + */ + private long _softMinEvictableIdleTimeMillis = DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS; /** My pool. */ private CursorableLinkedList _pool = null;
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]