001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.pool.impl;
019
020 import java.util.ArrayList;
021 import java.util.Collection;
022 import java.util.Iterator;
023 import java.util.LinkedList;
024 import java.util.List;
025 import java.util.NoSuchElementException;
026 import java.util.TimerTask;
027
028 import org.apache.commons.pool.BaseObjectPool;
029 import org.apache.commons.pool.ObjectPool;
030 import org.apache.commons.pool.PoolableObjectFactory;
031 import org.apache.commons.pool.impl.GenericKeyedObjectPool.ObjectTimestampPair;
032
033 /**
034 * A configurable {@link ObjectPool} implementation.
035 * <p>
036 * When coupled with the appropriate {@link PoolableObjectFactory},
037 * <tt>GenericObjectPool</tt> provides robust pooling functionality for
038 * arbitrary objects.
039 * <p>
040 * A <tt>GenericObjectPool</tt> provides a number of configurable parameters:
041 * <ul>
042 * <li>
043 * {@link #setMaxActive <i>maxActive</i>} controls the maximum number of
044 * objects that can be allocated by the pool (checked out to clients, or
045 * idle awaiting checkout) at a given time. When non-positive, there is no
046 * limit to the number of objects that can be managed by the pool at one time.
047 * When {@link #setMaxActive <i>maxActive</i>} is reached, the pool is said
048 * to be exhausted. The default setting for this parameter is 8.
049 * </li>
050 * <li>
051 * {@link #setMaxIdle <i>maxIdle</i>} controls the maximum number of objects
052 * that can sit idle in the pool at any time. When negative, there is no
053 * limit to the number of objects that may be idle at one time. The default
054 * setting for this parameter is 8.
055 * </li>
056 * <li>
057 * {@link #setWhenExhaustedAction <i>whenExhaustedAction</i>} specifies the
058 * behavior of the {@link #borrowObject} method when the pool is exhausted:
059 * <ul>
060 * <li>
061 * When {@link #setWhenExhaustedAction <i>whenExhaustedAction</i>} is
062 * {@link #WHEN_EXHAUSTED_FAIL}, {@link #borrowObject} will throw
063 * a {@link NoSuchElementException}
064 * </li>
065 * <li>
066 * When {@link #setWhenExhaustedAction <i>whenExhaustedAction</i>} is
067 * {@link #WHEN_EXHAUSTED_GROW}, {@link #borrowObject} will create a new
068 * object and return it (essentially making {@link #setMaxActive <i>maxActive</i>}
069 * meaningless.)
070 * </li>
071 * <li>
072 * When {@link #setWhenExhaustedAction <i>whenExhaustedAction</i>}
073 * is {@link #WHEN_EXHAUSTED_BLOCK}, {@link #borrowObject} will block
074 * (invoke {@link Object#wait()}) until a new or idle object is available.
075 * If a positive {@link #setMaxWait <i>maxWait</i>}
076 * value is supplied, then {@link #borrowObject} will block for at
077 * most that many milliseconds, after which a {@link NoSuchElementException}
078 * will be thrown. If {@link #setMaxWait <i>maxWait</i>} is non-positive,
079 * the {@link #borrowObject} method will block indefinitely.
080 * </li>
081 * </ul>
082 * The default <code>whenExhaustedAction</code> setting is
083 * {@link #WHEN_EXHAUSTED_BLOCK} and the default <code>maxWait</code>
084 * setting is -1. By default, therefore, <code>borrowObject</code> will
085 * block indefinitely until an idle instance becomes available.
086 * </li>
087 * <li>
088 * When {@link #setTestOnBorrow <i>testOnBorrow</i>} is set, the pool will
089 * attempt to validate each object before it is returned from the
090 * {@link #borrowObject} method. (Using the provided factory's
091 * {@link PoolableObjectFactory#validateObject} method.) Objects that fail
092 * to validate will be dropped from the pool, and a different object will
093 * be borrowed. The default setting for this parameter is
094 * <code>false.</code>
095 * </li>
096 * <li>
097 * When {@link #setTestOnReturn <i>testOnReturn</i>} is set, the pool will
098 * attempt to validate each object before it is returned to the pool in the
099 * {@link #returnObject} method. (Using the provided factory's
100 * {@link PoolableObjectFactory#validateObject}
101 * method.) Objects that fail to validate will be dropped from the pool.
102 * The default setting for this parameter is <code>false.</code>
103 * </li>
104 * </ul>
105 * <p>
106 * Optionally, one may configure the pool to examine and possibly evict objects
107 * as they sit idle in the pool and to ensure that a minimum number of idle
108 * objects are available. This is performed by an "idle object eviction"
109 * thread, which runs asynchronously. Caution should be used when configuring
110 * this optional feature. Eviction runs require an exclusive synchronization
111 * lock on the pool, so if they run too frequently and / or incur excessive
112 * latency when creating, destroying or validating object instances,
113 * performance issues may result. The idle object eviction thread may be
114 * configured using the following attributes:
115 * <ul>
116 * <li>
117 * {@link #setTimeBetweenEvictionRunsMillis <i>timeBetweenEvictionRunsMillis</i>}
118 * indicates how long the eviction thread should sleep before "runs" of examining
119 * idle objects. When non-positive, no eviction thread will be launched. The
120 * default setting for this parameter is -1 (i.e., idle object eviction is
121 * disabled by default).
122 * </li>
123 * <li>
124 * {@link #setMinEvictableIdleTimeMillis <i>minEvictableIdleTimeMillis</i>}
125 * specifies the minimum amount of time that an object may sit idle in the pool
126 * before it is eligible for eviction due to idle time. When non-positive, no object
127 * will be dropped from the pool due to idle time alone. This setting has no
128 * effect unless <code>timeBetweenEvictionRunsMillis > 0.</code> The default
129 * setting for this parameter is 30 minutes.
130 * </li>
131 * <li>
132 * {@link #setTestWhileIdle <i>testWhileIdle</i>} indicates whether or not idle
133 * objects should be validated using the factory's
134 * {@link PoolableObjectFactory#validateObject} method. Objects that fail to
135 * validate will be dropped from the pool. This setting has no effect unless
136 * <code>timeBetweenEvictionRunsMillis > 0.</code> The default setting for
137 * this parameter is <code>false.</code>
138 * </li>
139 * <li>
140 * {@link #setSoftMinEvictableIdleTimeMillis <i>softMinEvictableIdleTimeMillis</i>}
141 * specifies the minimum amount of time an object may sit idle in the pool
142 * before it is eligible for eviction by the idle object evictor
143 * (if any), with the extra condition that at least "minIdle" object instances
144 * remain in the pool. When non-positive, no objects will be evicted from the pool
145 * due to idle time alone. This setting has no effect unless
146 * <code>timeBetweenEvictionRunsMillis > 0.</code> and it is superceded by
147 * {@link #setMinEvictableIdleTimeMillis <i>minEvictableIdleTimeMillis</i>}
148 * (that is, if <code>minEvictableIdleTimeMillis</code> is positive, then
149 * <code>softMinEvictableIdleTimeMillis</code> is ignored). The default setting for
150 * this parameter is -1 (disabled).
151 * </li>
152 * <li>
153 * {@link #setNumTestsPerEvictionRun <i>numTestsPerEvictionRun</i>}
154 * determines the number of objects examined in each run of the idle object
155 * evictor. This setting has no effect unless
156 * <code>timeBetweenEvictionRunsMillis > 0.</code> The default setting for
157 * this parameter is 3.
158 * </li>
159 * </ul>
160 * <p>
161 * <p>
162 * The pool can be configured to behave as a LIFO queue with respect to idle
163 * objects - always returning the most recently used object from the pool,
164 * or as a FIFO queue, where borrowObject always returns the oldest object
165 * in the idle object pool.
166 * <ul>
167 * <li>
168 * {@link #setLifo <i>lifo</i>}
169 * determines whether or not the pool returns idle objects in
170 * last-in-first-out order. The default setting for this parameter is
171 * <code>true.</code>
172 * </li>
173 * </ul>
174 * <p>
175 * GenericObjectPool is not usable without a {@link PoolableObjectFactory}. A
176 * non-<code>null</code> factory must be provided either as a constructor argument
177 * or via a call to {@link #setFactory} before the pool is used.
178 * <p>
179 * Implementation note: To prevent possible deadlocks, care has been taken to
180 * ensure that no call to a factory method will occur within a synchronization
181 * block. See POOL-125 and DBCP-44 for more information.
182 *
183 * @see GenericKeyedObjectPool
184 * @author Rodney Waldhoff
185 * @author Dirk Verbeeck
186 * @author Sandy McArthur
187 * @version $Revision: 778428 $ $Date: 2009-05-25 10:34:21 -0400 (Mon, 25 May 2009) $
188 * @since Pool 1.0
189 */
190 public class GenericObjectPool extends BaseObjectPool implements ObjectPool {
191
192 //--- public constants -------------------------------------------
193
194 /**
195 * A "when exhausted action" type indicating that when the pool is
196 * exhausted (i.e., the maximum number of active objects has
197 * been reached), the {@link #borrowObject}
198 * method should fail, throwing a {@link NoSuchElementException}.
199 * @see #WHEN_EXHAUSTED_BLOCK
200 * @see #WHEN_EXHAUSTED_GROW
201 * @see #setWhenExhaustedAction
202 */
203 public static final byte WHEN_EXHAUSTED_FAIL = 0;
204
205 /**
206 * A "when exhausted action" type indicating that when the pool
207 * is exhausted (i.e., the maximum number
208 * of active objects has been reached), the {@link #borrowObject}
209 * method should block until a new object is available, or the
210 * {@link #getMaxWait maximum wait time} has been reached.
211 * @see #WHEN_EXHAUSTED_FAIL
212 * @see #WHEN_EXHAUSTED_GROW
213 * @see #setMaxWait
214 * @see #getMaxWait
215 * @see #setWhenExhaustedAction
216 */
217 public static final byte WHEN_EXHAUSTED_BLOCK = 1;
218
219 /**
220 * A "when exhausted action" type indicating that when the pool is
221 * exhausted (i.e., the maximum number
222 * of active objects has been reached), the {@link #borrowObject}
223 * method should simply create a new object anyway.
224 * @see #WHEN_EXHAUSTED_FAIL
225 * @see #WHEN_EXHAUSTED_GROW
226 * @see #setWhenExhaustedAction
227 */
228 public static final byte WHEN_EXHAUSTED_GROW = 2;
229
230 /**
231 * The default cap on the number of "sleeping" instances in the pool.
232 * @see #getMaxIdle
233 * @see #setMaxIdle
234 */
235 public static final int DEFAULT_MAX_IDLE = 8;
236
237 /**
238 * The default minimum number of "sleeping" instances in the pool
239 * before before the evictor thread (if active) spawns new objects.
240 * @see #getMinIdle
241 * @see #setMinIdle
242 */
243 public static final int DEFAULT_MIN_IDLE = 0;
244
245 /**
246 * The default cap on the total number of active instances from the pool.
247 * @see #getMaxActive
248 */
249 public static final int DEFAULT_MAX_ACTIVE = 8;
250
251 /**
252 * The default "when exhausted action" for the pool.
253 * @see #WHEN_EXHAUSTED_BLOCK
254 * @see #WHEN_EXHAUSTED_FAIL
255 * @see #WHEN_EXHAUSTED_GROW
256 * @see #setWhenExhaustedAction
257 */
258 public static final byte DEFAULT_WHEN_EXHAUSTED_ACTION = WHEN_EXHAUSTED_BLOCK;
259
260 /**
261 * The default LIFO status. True means that borrowObject returns the
262 * most recently used ("last in") idle object in the pool (if there are
263 * idle instances available). False means that the pool behaves as a FIFO
264 * queue - objects are taken from the idle object pool in the order that
265 * they are returned to the pool.
266 * @see #setLifo
267 * @since 1.4
268 */
269 public static final boolean DEFAULT_LIFO = true;
270
271 /**
272 * The default maximum amount of time (in milliseconds) the
273 * {@link #borrowObject} method should block before throwing
274 * an exception when the pool is exhausted and the
275 * {@link #getWhenExhaustedAction "when exhausted" action} is
276 * {@link #WHEN_EXHAUSTED_BLOCK}.
277 * @see #getMaxWait
278 * @see #setMaxWait
279 */
280 public static final long DEFAULT_MAX_WAIT = -1L;
281
282 /**
283 * The default "test on borrow" value.
284 * @see #getTestOnBorrow
285 * @see #setTestOnBorrow
286 */
287 public static final boolean DEFAULT_TEST_ON_BORROW = false;
288
289 /**
290 * The default "test on return" value.
291 * @see #getTestOnReturn
292 * @see #setTestOnReturn
293 */
294 public static final boolean DEFAULT_TEST_ON_RETURN = false;
295
296 /**
297 * The default "test while idle" value.
298 * @see #getTestWhileIdle
299 * @see #setTestWhileIdle
300 * @see #getTimeBetweenEvictionRunsMillis
301 * @see #setTimeBetweenEvictionRunsMillis
302 */
303 public static final boolean DEFAULT_TEST_WHILE_IDLE = false;
304
305 /**
306 * The default "time between eviction runs" value.
307 * @see #getTimeBetweenEvictionRunsMillis
308 * @see #setTimeBetweenEvictionRunsMillis
309 */
310 public static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = -1L;
311
312 /**
313 * The default number of objects to examine per run in the
314 * idle object evictor.
315 * @see #getNumTestsPerEvictionRun
316 * @see #setNumTestsPerEvictionRun
317 * @see #getTimeBetweenEvictionRunsMillis
318 * @see #setTimeBetweenEvictionRunsMillis
319 */
320 public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 3;
321
322 /**
323 * The default value for {@link #getMinEvictableIdleTimeMillis}.
324 * @see #getMinEvictableIdleTimeMillis
325 * @see #setMinEvictableIdleTimeMillis
326 */
327 public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L;
328
329 /**
330 * The default value for {@link #getSoftMinEvictableIdleTimeMillis}.
331 * @see #getSoftMinEvictableIdleTimeMillis
332 * @see #setSoftMinEvictableIdleTimeMillis
333 */
334 public static final long DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS = -1;
335
336 //--- constructors -----------------------------------------------
337
338 /**
339 * Create a new <tt>GenericObjectPool</tt> with default properties.
340 */
341 public GenericObjectPool() {
342 this(null, DEFAULT_MAX_ACTIVE, DEFAULT_WHEN_EXHAUSTED_ACTION, DEFAULT_MAX_WAIT, DEFAULT_MAX_IDLE,
343 DEFAULT_MIN_IDLE, DEFAULT_TEST_ON_BORROW, DEFAULT_TEST_ON_RETURN, DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS,
344 DEFAULT_NUM_TESTS_PER_EVICTION_RUN, DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, DEFAULT_TEST_WHILE_IDLE);
345 }
346
347 /**
348 * Create a new <tt>GenericObjectPool</tt> using the specified factory.
349 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
350 */
351 public GenericObjectPool(PoolableObjectFactory factory) {
352 this(factory, DEFAULT_MAX_ACTIVE, DEFAULT_WHEN_EXHAUSTED_ACTION, DEFAULT_MAX_WAIT, DEFAULT_MAX_IDLE,
353 DEFAULT_MIN_IDLE, DEFAULT_TEST_ON_BORROW, DEFAULT_TEST_ON_RETURN, DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS,
354 DEFAULT_NUM_TESTS_PER_EVICTION_RUN, DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, DEFAULT_TEST_WHILE_IDLE);
355 }
356
357 /**
358 * Create a new <tt>GenericObjectPool</tt> using the specified values.
359 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
360 * @param config a non-<tt>null</tt> {@link GenericObjectPool.Config} describing my configuration
361 */
362 public GenericObjectPool(PoolableObjectFactory factory, GenericObjectPool.Config config) {
363 this(factory, config.maxActive, config.whenExhaustedAction, config.maxWait, config.maxIdle, config.minIdle,
364 config.testOnBorrow, config.testOnReturn, config.timeBetweenEvictionRunsMillis,
365 config.numTestsPerEvictionRun, config.minEvictableIdleTimeMillis, config.testWhileIdle,
366 config.softMinEvictableIdleTimeMillis, config.lifo);
367 }
368
369 /**
370 * Create a new <tt>GenericObjectPool</tt> using the specified values.
371 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
372 * @param maxActive the maximum number of objects that can be borrowed from me at one time (see {@link #setMaxActive})
373 */
374 public GenericObjectPool(PoolableObjectFactory factory, int maxActive) {
375 this(factory, maxActive, DEFAULT_WHEN_EXHAUSTED_ACTION, DEFAULT_MAX_WAIT, DEFAULT_MAX_IDLE, DEFAULT_MIN_IDLE,
376 DEFAULT_TEST_ON_BORROW, DEFAULT_TEST_ON_RETURN, DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS,
377 DEFAULT_NUM_TESTS_PER_EVICTION_RUN, DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, DEFAULT_TEST_WHILE_IDLE);
378 }
379
380 /**
381 * Create a new <tt>GenericObjectPool</tt> using the specified values.
382 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
383 * @param maxActive the maximum number of objects that can be borrowed from me at one time (see {@link #setMaxActive})
384 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #getWhenExhaustedAction})
385 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted an and
386 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #getMaxWait})
387 */
388 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait) {
389 this(factory, maxActive, whenExhaustedAction, maxWait, DEFAULT_MAX_IDLE, DEFAULT_MIN_IDLE, DEFAULT_TEST_ON_BORROW,
390 DEFAULT_TEST_ON_RETURN, DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS, DEFAULT_NUM_TESTS_PER_EVICTION_RUN,
391 DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, DEFAULT_TEST_WHILE_IDLE);
392 }
393
394 /**
395 * Create a new <tt>GenericObjectPool</tt> using the specified values.
396 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
397 * @param maxActive the maximum number of objects that can be borrowed at one time (see {@link #setMaxActive})
398 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #getWhenExhaustedAction})
399 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted an and
400 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #getMaxWait})
401 * @param testOnBorrow whether or not to validate objects before they are returned by the {@link #borrowObject} method
402 * (see {@link #getTestOnBorrow})
403 * @param testOnReturn whether or not to validate objects after they are returned to the {@link #returnObject} method
404 * (see {@link #getTestOnReturn})
405 */
406 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait,
407 boolean testOnBorrow, boolean testOnReturn) {
408 this(factory, maxActive, whenExhaustedAction, maxWait, DEFAULT_MAX_IDLE, DEFAULT_MIN_IDLE, testOnBorrow,
409 testOnReturn, DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS, DEFAULT_NUM_TESTS_PER_EVICTION_RUN,
410 DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, DEFAULT_TEST_WHILE_IDLE);
411 }
412
413 /**
414 * Create a new <tt>GenericObjectPool</tt> using the specified values.
415 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
416 * @param maxActive the maximum number of objects that can be borrowed at one time (see {@link #setMaxActive})
417 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #getWhenExhaustedAction})
418 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted and
419 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #getMaxWait})
420 * @param maxIdle the maximum number of idle objects in my pool (see {@link #getMaxIdle})
421 */
422 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle) {
423 this(factory, maxActive, whenExhaustedAction, maxWait, maxIdle, DEFAULT_MIN_IDLE, DEFAULT_TEST_ON_BORROW,
424 DEFAULT_TEST_ON_RETURN, DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS, DEFAULT_NUM_TESTS_PER_EVICTION_RUN,
425 DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, DEFAULT_TEST_WHILE_IDLE);
426 }
427
428 /**
429 * Create a new <tt>GenericObjectPool</tt> using the specified values.
430 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
431 * @param maxActive the maximum number of objects that can be borrowed at one time (see {@link #setMaxActive})
432 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #getWhenExhaustedAction})
433 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted and
434 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #getMaxWait})
435 * @param maxIdle the maximum number of idle objects in my pool (see {@link #getMaxIdle})
436 * @param testOnBorrow whether or not to validate objects before they are returned by the {@link #borrowObject} method
437 * (see {@link #getTestOnBorrow})
438 * @param testOnReturn whether or not to validate objects after they are returned to the {@link #returnObject} method
439 * (see {@link #getTestOnReturn})
440 */
441 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait,
442 int maxIdle, boolean testOnBorrow, boolean testOnReturn) {
443 this(factory, maxActive, whenExhaustedAction, maxWait, maxIdle, DEFAULT_MIN_IDLE, testOnBorrow, testOnReturn,
444 DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS, DEFAULT_NUM_TESTS_PER_EVICTION_RUN,
445 DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS, DEFAULT_TEST_WHILE_IDLE);
446 }
447
448 /**
449 * Create a new <tt>GenericObjectPool</tt> using the specified values.
450 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
451 * @param maxActive the maximum number of objects that can be borrowed at one time (see {@link #setMaxActive})
452 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #setWhenExhaustedAction})
453 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted and
454 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #setMaxWait})
455 * @param maxIdle the maximum number of idle objects in my pool (see {@link #setMaxIdle})
456 * @param testOnBorrow whether or not to validate objects before they are returned by the {@link #borrowObject}
457 * method (see {@link #setTestOnBorrow})
458 * @param testOnReturn whether or not to validate objects after they are returned to the {@link #returnObject} method
459 * (see {@link #setTestOnReturn})
460 * @param timeBetweenEvictionRunsMillis the amount of time (in milliseconds) to sleep between examining idle objects
461 * for eviction (see {@link #setTimeBetweenEvictionRunsMillis})
462 * @param numTestsPerEvictionRun the number of idle objects to examine per run within the idle object eviction thread
463 * (if any) (see {@link #setNumTestsPerEvictionRun})
464 * @param minEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the pool before it
465 * is eligible for eviction (see {@link #setMinEvictableIdleTimeMillis})
466 * @param testWhileIdle whether or not to validate objects in the idle object eviction thread, if any
467 * (see {@link #setTestWhileIdle})
468 */
469 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait,
470 int maxIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis,
471 int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle) {
472 this(factory, maxActive, whenExhaustedAction, maxWait, maxIdle, DEFAULT_MIN_IDLE, testOnBorrow, testOnReturn,
473 timeBetweenEvictionRunsMillis, numTestsPerEvictionRun, minEvictableIdleTimeMillis, testWhileIdle);
474 }
475
476 /**
477 * Create a new <tt>GenericObjectPool</tt> using the specified values.
478 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
479 * @param maxActive the maximum number of objects that can be borrowed at one time (see {@link #setMaxActive})
480 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #setWhenExhaustedAction})
481 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted and
482 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #setMaxWait})
483 * @param maxIdle the maximum number of idle objects in my pool (see {@link #setMaxIdle})
484 * @param minIdle the minimum number of idle objects in my pool (see {@link #setMinIdle})
485 * @param testOnBorrow whether or not to validate objects before they are returned by the {@link #borrowObject} method
486 * (see {@link #setTestOnBorrow})
487 * @param testOnReturn whether or not to validate objects after they are returned to the {@link #returnObject} method
488 * (see {@link #setTestOnReturn})
489 * @param timeBetweenEvictionRunsMillis the amount of time (in milliseconds) to sleep between examining idle objects
490 * for eviction (see {@link #setTimeBetweenEvictionRunsMillis})
491 * @param numTestsPerEvictionRun the number of idle objects to examine per run within the idle object eviction thread
492 * (if any) (see {@link #setNumTestsPerEvictionRun})
493 * @param minEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the pool before
494 * it is eligible for eviction (see {@link #setMinEvictableIdleTimeMillis})
495 * @param testWhileIdle whether or not to validate objects in the idle object eviction thread, if any
496 * (see {@link #setTestWhileIdle})
497 */
498 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait,
499 int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis,
500 int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle) {
501 this(factory, maxActive, whenExhaustedAction, maxWait, maxIdle, minIdle, testOnBorrow, testOnReturn,
502 timeBetweenEvictionRunsMillis, numTestsPerEvictionRun, minEvictableIdleTimeMillis, testWhileIdle,
503 DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS);
504 }
505
506 /**
507 * Create a new <tt>GenericObjectPool</tt> using the specified values.
508 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
509 * @param maxActive the maximum number of objects that can be borrowed at one time (see {@link #setMaxActive})
510 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #setWhenExhaustedAction})
511 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted and
512 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #setMaxWait})
513 * @param maxIdle the maximum number of idle objects in my pool (see {@link #setMaxIdle})
514 * @param minIdle the minimum number of idle objects in my pool (see {@link #setMinIdle})
515 * @param testOnBorrow whether or not to validate objects before they are returned by the {@link #borrowObject}
516 * method (see {@link #setTestOnBorrow})
517 * @param testOnReturn whether or not to validate objects after they are returned to the {@link #returnObject}
518 * method (see {@link #setTestOnReturn})
519 * @param timeBetweenEvictionRunsMillis the amount of time (in milliseconds) to sleep between examining idle objects
520 * for eviction (see {@link #setTimeBetweenEvictionRunsMillis})
521 * @param numTestsPerEvictionRun the number of idle objects to examine per run within the idle object eviction thread
522 * (if any) (see {@link #setNumTestsPerEvictionRun})
523 * @param minEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the pool before
524 * it is eligible for eviction (see {@link #setMinEvictableIdleTimeMillis})
525 * @param testWhileIdle whether or not to validate objects in the idle object eviction thread, if any
526 * (see {@link #setTestWhileIdle})
527 * @param softMinEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the pool before it is
528 * eligible for eviction with the extra condition that at least "minIdle" amount of object remain in the pool.
529 * (see {@link #setSoftMinEvictableIdleTimeMillis})
530 * @since Pool 1.3
531 */
532 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait,
533 int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis,
534 int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle,
535 long softMinEvictableIdleTimeMillis) {
536 this(factory, maxActive, whenExhaustedAction, maxWait, maxIdle, minIdle, testOnBorrow, testOnReturn,
537 timeBetweenEvictionRunsMillis, numTestsPerEvictionRun, minEvictableIdleTimeMillis, testWhileIdle,
538 softMinEvictableIdleTimeMillis, DEFAULT_LIFO);
539 }
540
541 /**
542 * Create a new <tt>GenericObjectPool</tt> using the specified values.
543 * @param factory the (possibly <tt>null</tt>)PoolableObjectFactory to use to create, validate and destroy objects
544 * @param maxActive the maximum number of objects that can be borrowed at one time (see {@link #setMaxActive})
545 * @param whenExhaustedAction the action to take when the pool is exhausted (see {@link #setWhenExhaustedAction})
546 * @param maxWait the maximum amount of time to wait for an idle object when the pool is exhausted and
547 * <i>whenExhaustedAction</i> is {@link #WHEN_EXHAUSTED_BLOCK} (otherwise ignored) (see {@link #setMaxWait})
548 * @param maxIdle the maximum number of idle objects in my pool (see {@link #setMaxIdle})
549 * @param minIdle the minimum number of idle objects in my pool (see {@link #setMinIdle})
550 * @param testOnBorrow whether or not to validate objects before they are returned by the {@link #borrowObject}
551 * method (see {@link #setTestOnBorrow})
552 * @param testOnReturn whether or not to validate objects after they are returned to the {@link #returnObject}
553 * method (see {@link #setTestOnReturn})
554 * @param timeBetweenEvictionRunsMillis the amount of time (in milliseconds) to sleep between examining idle
555 * objects for eviction (see {@link #setTimeBetweenEvictionRunsMillis})
556 * @param numTestsPerEvictionRun the number of idle objects to examine per run within the idle object eviction
557 * thread (if any) (see {@link #setNumTestsPerEvictionRun})
558 * @param minEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the pool before
559 * it is eligible for eviction (see {@link #setMinEvictableIdleTimeMillis})
560 * @param testWhileIdle whether or not to validate objects in the idle object eviction thread, if any
561 * (see {@link #setTestWhileIdle})
562 * @param softMinEvictableIdleTimeMillis the minimum number of milliseconds an object can sit idle in the
563 * pool before it is eligible for eviction with the extra condition that at least "minIdle" amount of object
564 * remain in the pool. (see {@link #setSoftMinEvictableIdleTimeMillis})
565 * @param lifo whether or not objects are returned in last-in-first-out order from the idle object pool
566 * (see {@link #setLifo})
567 * @since Pool 1.4
568 */
569 public GenericObjectPool(PoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait,
570 int maxIdle, int minIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis,
571 int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle,
572 long softMinEvictableIdleTimeMillis, boolean lifo) {
573 _factory = factory;
574 _maxActive = maxActive;
575 _lifo = lifo;
576 switch(whenExhaustedAction) {
577 case WHEN_EXHAUSTED_BLOCK:
578 case WHEN_EXHAUSTED_FAIL:
579 case WHEN_EXHAUSTED_GROW:
580 _whenExhaustedAction = whenExhaustedAction;
581 break;
582 default:
583 throw new IllegalArgumentException("whenExhaustedAction " + whenExhaustedAction + " not recognized.");
584 }
585 _maxWait = maxWait;
586 _maxIdle = maxIdle;
587 _minIdle = minIdle;
588 _testOnBorrow = testOnBorrow;
589 _testOnReturn = testOnReturn;
590 _timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
591 _numTestsPerEvictionRun = numTestsPerEvictionRun;
592 _minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
593 _softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;
594 _testWhileIdle = testWhileIdle;
595
596 _pool = new CursorableLinkedList();
597 startEvictor(_timeBetweenEvictionRunsMillis);
598 }
599
600 //--- public methods ---------------------------------------------
601
602 //--- configuration methods --------------------------------------
603
604 /**
605 * Returns the maximum number of objects that can be allocated by the pool
606 * (checked out to clients, or idle awaiting checkout) at a given time.
607 * When non-positive, there is no limit to the number of objects that can
608 * be managed by the pool at one time.
609 *
610 * @return the cap on the total number of object instances managed by the pool.
611 * @see #setMaxActive
612 */
613 public synchronized int getMaxActive() {
614 return _maxActive;
615 }
616
617 /**
618 * Sets the cap on the number of objects that can be allocated by the pool
619 * (checked out to clients, or idle awaiting checkout) at a given time. Use
620 * a negative value for no limit.
621 *
622 * @param maxActive The cap on the total number of object instances managed by the pool.
623 * Negative values mean that there is no limit to the number of objects allocated
624 * by the pool.
625 * @see #getMaxActive
626 */
627 public synchronized void setMaxActive(int maxActive) {
628 _maxActive = maxActive;
629 allocate();
630 }
631
632 /**
633 * Returns the action to take when the {@link #borrowObject} method
634 * is invoked when the pool is exhausted (the maximum number
635 * of "active" objects has been reached).
636 *
637 * @return one of {@link #WHEN_EXHAUSTED_BLOCK}, {@link #WHEN_EXHAUSTED_FAIL} or {@link #WHEN_EXHAUSTED_GROW}
638 * @see #setWhenExhaustedAction
639 */
640 public synchronized byte getWhenExhaustedAction() {
641 return _whenExhaustedAction;
642 }
643
644 /**
645 * Sets the action to take when the {@link #borrowObject} method
646 * is invoked when the pool is exhausted (the maximum number
647 * of "active" objects has been reached).
648 *
649 * @param whenExhaustedAction the action code, which must be one of
650 * {@link #WHEN_EXHAUSTED_BLOCK}, {@link #WHEN_EXHAUSTED_FAIL},
651 * or {@link #WHEN_EXHAUSTED_GROW}
652 * @see #getWhenExhaustedAction
653 */
654 public synchronized void setWhenExhaustedAction(byte whenExhaustedAction) {
655 switch(whenExhaustedAction) {
656 case WHEN_EXHAUSTED_BLOCK:
657 case WHEN_EXHAUSTED_FAIL:
658 case WHEN_EXHAUSTED_GROW:
659 _whenExhaustedAction = whenExhaustedAction;
660 allocate();
661 break;
662 default:
663 throw new IllegalArgumentException("whenExhaustedAction " + whenExhaustedAction + " not recognized.");
664 }
665 }
666
667
668 /**
669 * Returns the maximum amount of time (in milliseconds) the
670 * {@link #borrowObject} method should block before throwing
671 * an exception when the pool is exhausted and the
672 * {@link #setWhenExhaustedAction "when exhausted" action} is
673 * {@link #WHEN_EXHAUSTED_BLOCK}.
674 *
675 * When less than or equal to 0, the {@link #borrowObject} method
676 * may block indefinitely.
677 *
678 * @return maximum number of milliseconds to block when borrowing an object.
679 * @see #setMaxWait
680 * @see #setWhenExhaustedAction
681 * @see #WHEN_EXHAUSTED_BLOCK
682 */
683 public synchronized long getMaxWait() {
684 return _maxWait;
685 }
686
687 /**
688 * Sets the maximum amount of time (in milliseconds) the
689 * {@link #borrowObject} method should block before throwing
690 * an exception when the pool is exhausted and the
691 * {@link #setWhenExhaustedAction "when exhausted" action} is
692 * {@link #WHEN_EXHAUSTED_BLOCK}.
693 *
694 * When less than or equal to 0, the {@link #borrowObject} method
695 * may block indefinitely.
696 *
697 * @param maxWait maximum number of milliseconds to block when borrowing an object.
698 * @see #getMaxWait
699 * @see #setWhenExhaustedAction
700 * @see #WHEN_EXHAUSTED_BLOCK
701 */
702 public synchronized void setMaxWait(long maxWait) {
703 _maxWait = maxWait;
704 allocate();
705 }
706
707 /**
708 * Returns the cap on the number of "idle" instances in the pool.
709 * @return the cap on the number of "idle" instances in the pool.
710 * @see #setMaxIdle
711 */
712 public synchronized int getMaxIdle() {
713 return _maxIdle;
714 }
715
716 /**
717 * Sets the cap on the number of "idle" instances in the pool.
718 * If maxIdle is set too low on heavily loaded systems it is possible you
719 * will see objects being destroyed and almost immediately new objects
720 * being created. This is a result of the active threads momentarily
721 * returning objects faster than they are requesting them them, causing the
722 * number of idle objects to rise above maxIdle. The best value for maxIdle
723 * for heavily loaded system will vary but the default is a good starting
724 * point.
725 * @param maxIdle The cap on the number of "idle" instances in the pool.
726 * Use a negative value to indicate an unlimited number of idle instances.
727 * @see #getMaxIdle
728 */
729 public synchronized void setMaxIdle(int maxIdle) {
730 _maxIdle = maxIdle;
731 allocate();
732 }
733
734 /**
735 * Sets the minimum number of objects allowed in the pool
736 * before the evictor thread (if active) spawns new objects.
737 * Note that no objects are created when
738 * <code>numActive + numIdle >= maxActive.</code>
739 * This setting has no effect if the idle object evictor is disabled
740 * (i.e. if <code>timeBetweenEvictionRunsMillis <= 0</code>).
741 *
742 * @param minIdle The minimum number of objects.
743 * @see #getMinIdle
744 * @see #getTimeBetweenEvictionRunsMillis()
745 */
746 public synchronized void setMinIdle(int minIdle) {
747 _minIdle = minIdle;
748 allocate();
749 }
750
751 /**
752 * Returns the minimum number of objects allowed in the pool
753 * before the evictor thread (if active) spawns new objects.
754 * (Note no objects are created when: numActive + numIdle >= maxActive)
755 *
756 * @return The minimum number of objects.
757 * @see #setMinIdle
758 */
759 public synchronized int getMinIdle() {
760 return _minIdle;
761 }
762
763 /**
764 * When <tt>true</tt>, objects will be
765 * {@link PoolableObjectFactory#validateObject validated}
766 * before being returned by the {@link #borrowObject}
767 * method. If the object fails to validate,
768 * it will be dropped from the pool, and we will attempt
769 * to borrow another.
770 *
771 * @return <code>true</code> if objects are validated before being borrowed.
772 * @see #setTestOnBorrow
773 */
774 public boolean getTestOnBorrow() {
775 return _testOnBorrow;
776 }
777
778 /**
779 * When <tt>true</tt>, objects will be
780 * {@link PoolableObjectFactory#validateObject validated}
781 * before being returned by the {@link #borrowObject}
782 * method. If the object fails to validate,
783 * it will be dropped from the pool, and we will attempt
784 * to borrow another.
785 *
786 * @param testOnBorrow <code>true</code> if objects should be validated before being borrowed.
787 * @see #getTestOnBorrow
788 */
789 public void setTestOnBorrow(boolean testOnBorrow) {
790 _testOnBorrow = testOnBorrow;
791 }
792
793 /**
794 * When <tt>true</tt>, objects will be
795 * {@link PoolableObjectFactory#validateObject validated}
796 * before being returned to the pool within the
797 * {@link #returnObject}.
798 *
799 * @return <code>true</code> when objects will be validated after returned to {@link #returnObject}.
800 * @see #setTestOnReturn
801 */
802 public boolean getTestOnReturn() {
803 return _testOnReturn;
804 }
805
806 /**
807 * When <tt>true</tt>, objects will be
808 * {@link PoolableObjectFactory#validateObject validated}
809 * before being returned to the pool within the
810 * {@link #returnObject}.
811 *
812 * @param testOnReturn <code>true</code> so objects will be validated after returned to {@link #returnObject}.
813 * @see #getTestOnReturn
814 */
815 public void setTestOnReturn(boolean testOnReturn) {
816 _testOnReturn = testOnReturn;
817 }
818
819 /**
820 * Returns the number of milliseconds to sleep between runs of the
821 * idle object evictor thread.
822 * When non-positive, no idle object evictor thread will be
823 * run.
824 *
825 * @return number of milliseconds to sleep between evictor runs.
826 * @see #setTimeBetweenEvictionRunsMillis
827 */
828 public synchronized long getTimeBetweenEvictionRunsMillis() {
829 return _timeBetweenEvictionRunsMillis;
830 }
831
832 /**
833 * Sets the number of milliseconds to sleep between runs of the
834 * idle object evictor thread.
835 * When non-positive, no idle object evictor thread will be
836 * run.
837 *
838 * @param timeBetweenEvictionRunsMillis number of milliseconds to sleep between evictor runs.
839 * @see #getTimeBetweenEvictionRunsMillis
840 */
841 public synchronized void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
842 _timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
843 startEvictor(_timeBetweenEvictionRunsMillis);
844 }
845
846 /**
847 * Returns the max number of objects to examine during each run of the
848 * idle object evictor thread (if any).
849 *
850 * @return max number of objects to examine during each evictor run.
851 * @see #setNumTestsPerEvictionRun
852 * @see #setTimeBetweenEvictionRunsMillis
853 */
854 public synchronized int getNumTestsPerEvictionRun() {
855 return _numTestsPerEvictionRun;
856 }
857
858 /**
859 * Sets the max number of objects to examine during each run of the
860 * idle object evictor thread (if any).
861 * <p>
862 * When a negative value is supplied, <tt>ceil({@link #getNumIdle})/abs({@link #getNumTestsPerEvictionRun})</tt>
863 * tests will be run. That is, when the value is <i>-n</i>, roughly one <i>n</i>th of the
864 * idle objects will be tested per run.
865 *
866 * @param numTestsPerEvictionRun max number of objects to examine during each evictor run.
867 * @see #getNumTestsPerEvictionRun
868 * @see #setTimeBetweenEvictionRunsMillis
869 */
870 public synchronized void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
871 _numTestsPerEvictionRun = numTestsPerEvictionRun;
872 }
873
874 /**
875 * Returns the minimum amount of time an object may sit idle in the pool
876 * before it is eligible for eviction by the idle object evictor
877 * (if any).
878 *
879 * @return minimum amount of time an object may sit idle in the pool before it is eligible for eviction.
880 * @see #setMinEvictableIdleTimeMillis
881 * @see #setTimeBetweenEvictionRunsMillis
882 */
883 public synchronized long getMinEvictableIdleTimeMillis() {
884 return _minEvictableIdleTimeMillis;
885 }
886
887 /**
888 * Sets the minimum amount of time an object may sit idle in the pool
889 * before it is eligible for eviction by the idle object evictor
890 * (if any).
891 * When non-positive, no objects will be evicted from the pool
892 * due to idle time alone.
893 * @param minEvictableIdleTimeMillis minimum amount of time an object may sit idle in the pool before
894 * it is eligible for eviction.
895 * @see #getMinEvictableIdleTimeMillis
896 * @see #setTimeBetweenEvictionRunsMillis
897 */
898 public synchronized void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
899 _minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
900 }
901
902 /**
903 * Returns the minimum amount of time an object may sit idle in the pool
904 * before it is eligible for eviction by the idle object evictor
905 * (if any), with the extra condition that at least
906 * "minIdle" amount of object remain in the pool.
907 *
908 * @return minimum amount of time an object may sit idle in the pool before it is eligible for eviction.
909 * @since Pool 1.3
910 * @see #setSoftMinEvictableIdleTimeMillis
911 */
912 public synchronized long getSoftMinEvictableIdleTimeMillis() {
913 return _softMinEvictableIdleTimeMillis;
914 }
915
916 /**
917 * Sets the minimum amount of time an object may sit idle in the pool
918 * before it is eligible for eviction by the idle object evictor
919 * (if any), with the extra condition that at least
920 * "minIdle" object instances remain in the pool.
921 * When non-positive, no objects will be evicted from the pool
922 * due to idle time alone.
923 *
924 * @param softMinEvictableIdleTimeMillis minimum amount of time an object may sit idle in the pool before
925 * it is eligible for eviction.
926 * @since Pool 1.3
927 * @see #getSoftMinEvictableIdleTimeMillis
928 */
929 public synchronized void setSoftMinEvictableIdleTimeMillis(long softMinEvictableIdleTimeMillis) {
930 _softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;
931 }
932
933 /**
934 * When <tt>true</tt>, objects will be
935 * {@link PoolableObjectFactory#validateObject validated}
936 * by the idle object evictor (if any). If an object
937 * fails to validate, it will be dropped from the pool.
938 *
939 * @return <code>true</code> when objects will be validated by the evictor.
940 * @see #setTestWhileIdle
941 * @see #setTimeBetweenEvictionRunsMillis
942 */
943 public synchronized boolean getTestWhileIdle() {
944 return _testWhileIdle;
945 }
946
947 /**
948 * When <tt>true</tt>, objects will be
949 * {@link PoolableObjectFactory#validateObject validated}
950 * by the idle object evictor (if any). If an object
951 * fails to validate, it will be dropped from the pool.
952 *
953 * @param testWhileIdle <code>true</code> so objects will be validated by the evictor.
954 * @see #getTestWhileIdle
955 * @see #setTimeBetweenEvictionRunsMillis
956 */
957 public synchronized void setTestWhileIdle(boolean testWhileIdle) {
958 _testWhileIdle = testWhileIdle;
959 }
960
961 /**
962 * Whether or not the idle object pool acts as a LIFO queue. True means
963 * that borrowObject returns the most recently used ("last in") idle object
964 * in the pool (if there are idle instances available). False means that
965 * the pool behaves as a FIFO queue - objects are taken from the idle object
966 * pool in the order that they are returned to the pool.
967 *
968 * @return <code>true</true> if the pool is configured to act as a LIFO queue
969 * @since 1.4
970 */
971 public synchronized boolean getLifo() {
972 return _lifo;
973 }
974
975 /**
976 * Sets the LIFO property of the pool. True means that borrowObject returns
977 * the most recently used ("last in") idle object in the pool (if there are
978 * idle instances available). False means that the pool behaves as a FIFO
979 * queue - objects are taken from the idle object pool in the order that
980 * they are returned to the pool.
981 *
982 * @param lifo the new value for the LIFO property
983 * @since 1.4
984 */
985 public synchronized void setLifo(boolean lifo) {
986 this._lifo = lifo;
987 }
988
989 /**
990 * Sets my configuration.
991 *
992 * @param conf configuration to use.
993 * @see GenericObjectPool.Config
994 */
995 public synchronized void setConfig(GenericObjectPool.Config conf) {
996 setMaxIdle(conf.maxIdle);
997 setMinIdle(conf.minIdle);
998 setMaxActive(conf.maxActive);
999 setMaxWait(conf.maxWait);
1000 setWhenExhaustedAction(conf.whenExhaustedAction);
1001 setTestOnBorrow(conf.testOnBorrow);
1002 setTestOnReturn(conf.testOnReturn);
1003 setTestWhileIdle(conf.testWhileIdle);
1004 setNumTestsPerEvictionRun(conf.numTestsPerEvictionRun);
1005 setMinEvictableIdleTimeMillis(conf.minEvictableIdleTimeMillis);
1006 setTimeBetweenEvictionRunsMillis(conf.timeBetweenEvictionRunsMillis);
1007 setSoftMinEvictableIdleTimeMillis(conf.softMinEvictableIdleTimeMillis);
1008 setLifo(conf.lifo);
1009 allocate();
1010 }
1011
1012 //-- ObjectPool methods ------------------------------------------
1013
1014 /**
1015 * <p>Borrows an object from the pool.</p>
1016 *
1017 * <p>If there is an idle instance available in the pool, then either the most-recently returned
1018 * (if {@link #getLifo() lifo} == true) or "oldest" (lifo == false) instance sitting idle in the pool
1019 * will be activated and returned. If activation fails, or {@link #getTestOnBorrow() testOnBorrow} is set
1020 * to true and validation fails, the instance is destroyed and the next available instance is examined.
1021 * This continues until either a valid instance is returned or there are no more idle instances available.</p>
1022 *
1023 * <p>If there are no idle instances available in the pool, behavior depends on the {@link #getMaxActive() maxActive}
1024 * and (if applicable) {@link #getWhenExhaustedAction() whenExhaustedAction} and {@link #getMaxWait() maxWait}
1025 * properties. If the number of instances checked out from the pool is less than <code>maxActive,</code> a new
1026 * instance is created, activated and (if applicable) validated and returned to the caller.</p>
1027 *
1028 * <p>If the pool is exhausted (no available idle instances and no capacity to create new ones),
1029 * this method will either block ({@link #WHEN_EXHAUSTED_BLOCK}), throw a <code>NoSuchElementException</code>
1030 * ({@link #WHEN_EXHAUSTED_FAIL}), or grow ({@link #WHEN_EXHAUSTED_GROW} - ignoring maxActive).
1031 * The length of time that this method will block when <code>whenExhaustedAction == WHEN_EXHAUSTED_BLOCK</code>
1032 * is determined by the {@link #getMaxWait() maxWait} property.</p>
1033 *
1034 * <p>When the pool is exhausted, multiple calling threads may be simultaneously blocked waiting for instances
1035 * to become available. As of pool 1.5, a "fairness" algorithm has been implemented to ensure that threads receive
1036 * available instances in request arrival order.</p>
1037 *
1038 * @return object instance
1039 * @throws NoSuchElementException if an instance cannot be returned
1040 */
1041 public Object borrowObject() throws Exception {
1042 long starttime = System.currentTimeMillis();
1043 Latch latch = new Latch();
1044 byte whenExhaustedAction;
1045 long maxWait;
1046 synchronized (this) {
1047 // Get local copy of current config. Can't sync when used later as
1048 // it can result in a deadlock. Has the added advantage that config
1049 // is consistent for entire method execution
1050 whenExhaustedAction = _whenExhaustedAction;
1051 maxWait = _maxWait;
1052
1053 // Add this request to the queue
1054 _allocationQueue.add(latch);
1055
1056 // Work the allocation queue, allocating idle instances and
1057 // instance creation permits in request arrival order
1058 allocate();
1059 }
1060
1061 for(;;) {
1062 synchronized (this) {
1063 assertOpen();
1064 }
1065
1066 // If no object was allocated from the pool above
1067 if(latch.getPair() == null) {
1068 // check if we were allowed to create one
1069 if(latch.mayCreate()) {
1070 // allow new object to be created
1071 } else {
1072 // the pool is exhausted
1073 switch(whenExhaustedAction) {
1074 case WHEN_EXHAUSTED_GROW:
1075 // allow new object to be created
1076 synchronized (this) {
1077 _allocationQueue.remove(latch);
1078 _numInternalProcessing++;
1079 }
1080 break;
1081 case WHEN_EXHAUSTED_FAIL:
1082 synchronized (this) {
1083 _allocationQueue.remove(latch);
1084 }
1085 throw new NoSuchElementException("Pool exhausted");
1086 case WHEN_EXHAUSTED_BLOCK:
1087 try {
1088 synchronized (latch) {
1089 if(maxWait <= 0) {
1090 latch.wait();
1091 } else {
1092 // this code may be executed again after a notify then continue cycle
1093 // so, need to calculate the amount of time to wait
1094 final long elapsed = (System.currentTimeMillis() - starttime);
1095 final long waitTime = maxWait - elapsed;
1096 if (waitTime > 0)
1097 {
1098 latch.wait(waitTime);
1099 }
1100 }
1101 }
1102 } catch(InterruptedException e) {
1103 Thread.currentThread().interrupt();
1104 throw e;
1105 }
1106 if(maxWait > 0 && ((System.currentTimeMillis() - starttime) >= maxWait)) {
1107 throw new NoSuchElementException("Timeout waiting for idle object");
1108 } else {
1109 continue; // keep looping
1110 }
1111 default:
1112 throw new IllegalArgumentException("WhenExhaustedAction property " + whenExhaustedAction +
1113 " not recognized.");
1114 }
1115 }
1116 }
1117
1118 boolean newlyCreated = false;
1119 if(null == latch.getPair()) {
1120 try {
1121 Object obj = _factory.makeObject();
1122 latch.setPair(new ObjectTimestampPair(obj));
1123 newlyCreated = true;
1124 } finally {
1125 if (!newlyCreated) {
1126 // object cannot be created
1127 synchronized (this) {
1128 _numInternalProcessing--;
1129 // No need to reset latch - about to throw exception
1130 allocate();
1131 }
1132 }
1133 }
1134 }
1135 // activate & validate the object
1136 try {
1137 _factory.activateObject(latch.getPair().value);
1138 if(_testOnBorrow &&
1139 !_factory.validateObject(latch.getPair().value)) {
1140 throw new Exception("ValidateObject failed");
1141 }
1142 synchronized(this) {
1143 _numInternalProcessing--;
1144 _numActive++;
1145 }
1146 return latch.getPair().value;
1147 }
1148 catch (Throwable e) {
1149 // object cannot be activated or is invalid
1150 try {
1151 _factory.destroyObject(latch.getPair().value);
1152 } catch (Throwable e2) {
1153 // cannot destroy broken object
1154 }
1155 synchronized (this) {
1156 _numInternalProcessing--;
1157 latch.reset();
1158 _allocationQueue.add(0, latch);
1159 allocate();
1160 }
1161 if(newlyCreated) {
1162 throw new NoSuchElementException("Could not create a validated object, cause: " + e.getMessage());
1163 }
1164 else {
1165 continue; // keep looping
1166 }
1167 }
1168 }
1169 }
1170
1171 /**
1172 * Allocate available instances to latches in the allocation queue. Then
1173 * set _mayCreate to true for as many additional latches remaining in queue
1174 * as _maxActive allows.
1175 */
1176 private synchronized void allocate() {
1177 if (isClosed()) return;
1178
1179 // First use any objects in the pool to clear the queue
1180 for (;;) {
1181 if (!_pool.isEmpty() && !_allocationQueue.isEmpty()) {
1182 Latch latch = (Latch) _allocationQueue.removeFirst();
1183 latch.setPair((ObjectTimestampPair) _pool.removeFirst());
1184 _numInternalProcessing++;
1185 synchronized (latch) {
1186 latch.notify();
1187 }
1188 } else {
1189 break;
1190 }
1191 }
1192
1193 // Second utilise any spare capacity to create new objects
1194 for(;;) {
1195 if((!_allocationQueue.isEmpty()) && (_maxActive < 0 || (_numActive + _numInternalProcessing) < _maxActive)) {
1196 Latch latch = (Latch) _allocationQueue.removeFirst();
1197 latch.setMayCreate(true);
1198 _numInternalProcessing++;
1199 synchronized (latch) {
1200 latch.notify();
1201 }
1202 } else {
1203 break;
1204 }
1205 }
1206 }
1207
1208 /**
1209 * <p>Invalidates the given object instance. Decrements the active count
1210 * and destroys the instance.</p>
1211 *
1212 * @param obj instance to invalidate
1213 * @throws Exception if an exception occurs destroying the object
1214 */
1215 public void invalidateObject(Object obj) throws Exception {
1216 try {
1217 if (_factory != null) {
1218 _factory.destroyObject(obj);
1219 }
1220 } finally {
1221 synchronized (this) {
1222 _numActive--;
1223 allocate();
1224 }
1225 }
1226 }
1227
1228 /**
1229 * Clears any objects sitting idle in the pool.
1230 */
1231 public void clear() {
1232 List toDestroy = new ArrayList();
1233
1234 synchronized(this) {
1235 toDestroy.addAll(_pool);
1236 _numInternalProcessing = _numInternalProcessing + _pool._size;
1237 _pool.clear();
1238 }
1239 destroy(toDestroy);
1240 }
1241
1242 /**
1243 * Private method to destroy all the objects in a collection. Assumes
1244 * objects in the collection are instances of ObjectTimestampPair
1245 *
1246 * @param c Collection of objects to destroy
1247 */
1248 private void destroy(Collection c) {
1249 for (Iterator it = c.iterator(); it.hasNext();) {
1250 try {
1251 _factory.destroyObject(((ObjectTimestampPair)(it.next())).value);
1252 } catch(Exception e) {
1253 // ignore error, keep destroying the rest
1254 } finally {
1255 synchronized(this) {
1256 _numInternalProcessing--;
1257 allocate();
1258 }
1259 }
1260 }
1261 }
1262
1263 /**
1264 * Return the number of instances currently borrowed from this pool.
1265 *
1266 * @return the number of instances currently borrowed from this pool
1267 */
1268 public synchronized int getNumActive() {
1269 return _numActive;
1270 }
1271
1272 /**
1273 * Return the number of instances currently idle in this pool.
1274 *
1275 * @return the number of instances currently idle in this pool
1276 */
1277 public synchronized int getNumIdle() {
1278 return _pool.size();
1279 }
1280
1281 /**
1282 * <p>Returns an object instance to the pool.</p>
1283 *
1284 * <p>If {@link #getMaxIdle() maxIdle} is set to a positive value and the number of idle instances
1285 * has reached this value, the returning instance is destroyed.</p>
1286 *
1287 * <p>If {@link #getTestOnReturn() testOnReturn} == true, the returning instance is validated before being returned
1288 * to the idle instance pool. In this case, if validation fails, the instance is destroyed.</p>
1289 *
1290 * <p><strong>Note: </strong> There is no guard to prevent an object
1291 * being returned to the pool multiple times. Clients are expected to
1292 * discard references to returned objects and ensure that an object is not
1293 * returned to the pool multiple times in sequence (i.e., without being
1294 * borrowed again between returns). Violating this contract will result in
1295 * the same object appearing multiple times in the pool and pool counters
1296 * (numActive, numIdle) returning incorrect values.</p>
1297 *
1298 * @param obj instance to return to the pool
1299 */
1300 public void returnObject(Object obj) throws Exception {
1301 try {
1302 addObjectToPool(obj, true);
1303 } catch (Exception e) {
1304 if (_factory != null) {
1305 try {
1306 _factory.destroyObject(obj);
1307 } catch (Exception e2) {
1308 // swallowed
1309 }
1310 // TODO: Correctness here depends on control in addObjectToPool.
1311 // These two methods should be refactored, removing the
1312 // "behavior flag", decrementNumActive, from addObjectToPool.
1313 synchronized(this) {
1314 _numActive--;
1315 allocate();
1316 }
1317 }
1318 }
1319 }
1320
1321 /**
1322 * <p>Adds an object to the pool.</p>
1323 *
1324 * <p>Validates the object if testOnReturn == true and passivates it before returning it to the pool.
1325 * if validation or passivation fails, or maxIdle is set and there is no room in the pool, the instance
1326 * is destroyed.</p>
1327 *
1328 * <p>Calls {@link #allocate()} on successful completion</p>
1329 *
1330 * @param obj instance to add to the pool
1331 * @param decrementNumActive whether or not to decrement the active count
1332 * @throws Exception
1333 */
1334 private void addObjectToPool(Object obj, boolean decrementNumActive) throws Exception {
1335 boolean success = true;
1336 if(_testOnReturn && !(_factory.validateObject(obj))) {
1337 success = false;
1338 } else {
1339 _factory.passivateObject(obj);
1340 }
1341
1342 boolean shouldDestroy = !success;
1343
1344 // Add instance to pool if there is room and it has passed validation
1345 // (if testOnreturn is set)
1346 synchronized (this) {
1347 if (isClosed()) {
1348 shouldDestroy = true;
1349 } else {
1350 if((_maxIdle >= 0) && (_pool.size() >= _maxIdle)) {
1351 shouldDestroy = true;
1352 } else if(success) {
1353 // borrowObject always takes the first element from the queue,
1354 // so for LIFO, push on top, FIFO add to end
1355 if (_lifo) {
1356 _pool.addFirst(new ObjectTimestampPair(obj));
1357 } else {
1358 _pool.addLast(new ObjectTimestampPair(obj));
1359 }
1360 if (decrementNumActive) {
1361 _numActive--;
1362 }
1363 allocate();
1364 }
1365 }
1366 }
1367
1368 // Destroy the instance if necessary
1369 if(shouldDestroy) {
1370 try {
1371 _factory.destroyObject(obj);
1372 } catch(Exception e) {
1373 // ignored
1374 }
1375 // Decrement active count *after* destroy if applicable
1376 if (decrementNumActive) {
1377 synchronized(this) {
1378 _numActive--;
1379 allocate();
1380 }
1381 }
1382 }
1383
1384 }
1385
1386 /**
1387 * Closes the pool. Once the pool is closed, {@link #borrowObject()}
1388 * will fail with IllegalStateException, but {@link #returnObject(Object)} and
1389 * {@link #invalidateObject(Object)} will continue to work. This method does not
1390 * {@link #clear()} the pool. The method is idempotent - that is, it is OK to call it on a closed
1391 * pool.
1392 *
1393 * @throws Exception
1394 */
1395 public void close() throws Exception {
1396 super.close();
1397 synchronized (this) {
1398 clear();
1399 startEvictor(-1L);
1400 }
1401 }
1402
1403 /**
1404 * Sets the {@link PoolableObjectFactory factory} this pool uses
1405 * to create new instances. Trying to change
1406 * the <code>factory</code> while there are borrowed objects will
1407 * throw an {@link IllegalStateException}.
1408 *
1409 * @param factory the {@link PoolableObjectFactory} used to create new instances.
1410 * @throws IllegalStateException when the factory cannot be set at this time
1411 */
1412 public void setFactory(PoolableObjectFactory factory) throws IllegalStateException {
1413 List toDestroy = new ArrayList();
1414 synchronized (this) {
1415 assertOpen();
1416 if(0 < getNumActive()) {
1417 throw new IllegalStateException("Objects are already active");
1418 } else {
1419 toDestroy.addAll(_pool);
1420 _numInternalProcessing = _numInternalProcessing + _pool._size;
1421 _pool.clear();
1422 }
1423 _factory = factory;
1424 }
1425 destroy(toDestroy);
1426 }
1427
1428 /**
1429 * <p>Perform <code>numTests</code> idle object eviction tests, evicting
1430 * examined objects that meet the criteria for eviction. If
1431 * <code>testWhileIdle</code> is true, examined objects are validated
1432 * when visited (and removed if invalid); otherwise only objects that
1433 * have been idle for more than <code>minEvicableIdletimeMillis</code>
1434 * are removed.</p>
1435 *
1436 * <p>Successive activations of this method examine objects in
1437 * in sequence, cycling through objects in oldest-to-youngest order.</p>
1438 *
1439 * @throws Exception if the pool is closed or eviction fails.
1440 */
1441 public void evict() throws Exception {
1442 assertOpen();
1443 synchronized (this) {
1444 if(_pool.isEmpty()) {
1445 return;
1446 }
1447 if (null == _evictionCursor) {
1448 _evictionCursor = (_pool.cursor(_lifo ? _pool.size() : 0));
1449 }
1450 }
1451
1452 for (int i=0,m=getNumTests();i<m;i++) {
1453 final ObjectTimestampPair pair;
1454 synchronized (this) {
1455 if ((_lifo && !_evictionCursor.hasPrevious()) ||
1456 !_lifo && !_evictionCursor.hasNext()) {
1457 _evictionCursor.close();
1458 _evictionCursor = _pool.cursor(_lifo ? _pool.size() : 0);
1459 }
1460
1461 pair = _lifo ?
1462 (ObjectTimestampPair) _evictionCursor.previous() :
1463 (ObjectTimestampPair) _evictionCursor.next();
1464
1465 _evictionCursor.remove();
1466 _numInternalProcessing++;
1467 }
1468
1469 boolean removeObject = false;
1470 final long idleTimeMilis = System.currentTimeMillis() - pair.tstamp;
1471 if ((getMinEvictableIdleTimeMillis() > 0) &&
1472 (idleTimeMilis > getMinEvictableIdleTimeMillis())) {
1473 removeObject = true;
1474 } else if ((getSoftMinEvictableIdleTimeMillis() > 0) &&
1475 (idleTimeMilis > getSoftMinEvictableIdleTimeMillis()) &&
1476 ((getNumIdle() + 1)> getMinIdle())) { // +1 accounts for object we are processing
1477 removeObject = true;
1478 }
1479 if(getTestWhileIdle() && !removeObject) {
1480 boolean active = false;
1481 try {
1482 _factory.activateObject(pair.value);
1483 active = true;
1484 } catch(Exception e) {
1485 removeObject=true;
1486 }
1487 if(active) {
1488 if(!_factory.validateObject(pair.value)) {
1489 removeObject=true;
1490 } else {
1491 try {
1492 _factory.passivateObject(pair.value);
1493 } catch(Exception e) {
1494 removeObject=true;
1495 }
1496 }
1497 }
1498 }
1499
1500 if (removeObject) {
1501 try {
1502 _factory.destroyObject(pair.value);
1503 } catch(Exception e) {
1504 // ignored
1505 }
1506 }
1507 synchronized (this) {
1508 if(!removeObject) {
1509 _evictionCursor.add(pair);
1510 if (_lifo) {
1511 // Skip over the element we just added back
1512 _evictionCursor.previous();
1513 }
1514 }
1515 _numInternalProcessing--;
1516 }
1517 }
1518 }
1519
1520 /**
1521 * Check to see if we are below our minimum number of objects
1522 * if so enough to bring us back to our minimum.
1523 *
1524 * @throws Exception when {@link #addObject()} fails.
1525 */
1526 private void ensureMinIdle() throws Exception {
1527 // this method isn't synchronized so the
1528 // calculateDeficit is done at the beginning
1529 // as a loop limit and a second time inside the loop
1530 // to stop when another thread already returned the
1531 // needed objects
1532 int objectDeficit = calculateDeficit(false);
1533 for ( int j = 0 ; j < objectDeficit && calculateDeficit(true) > 0 ; j++ ) {
1534 try {
1535 addObject();
1536 } finally {
1537 synchronized (this) {
1538 _numInternalProcessing--;
1539 allocate();
1540 }
1541 }
1542 }
1543 }
1544
1545 /**
1546 * This returns the number of objects to create during the pool
1547 * sustain cycle. This will ensure that the minimum number of idle
1548 * instances is maintained without going past the maxActive value.
1549 *
1550 * @param incrementInternal - Should the count of objects currently under
1551 * some form of internal processing be
1552 * incremented?
1553 * @return The number of objects to be created
1554 */
1555 private synchronized int calculateDeficit(boolean incrementInternal) {
1556 int objectDeficit = getMinIdle() - getNumIdle();
1557 if (_maxActive > 0) {
1558 int growLimit = Math.max(0,
1559 getMaxActive() - getNumActive() - getNumIdle() - _numInternalProcessing);
1560 objectDeficit = Math.min(objectDeficit, growLimit);
1561 }
1562 if (incrementInternal && objectDeficit >0) {
1563 _numInternalProcessing++;
1564 }
1565 return objectDeficit;
1566 }
1567
1568 /**
1569 * Create an object, and place it into the pool.
1570 * addObject() is useful for "pre-loading" a pool with idle objects.
1571 */
1572 public void addObject() throws Exception {
1573 assertOpen();
1574 if (_factory == null) {
1575 throw new IllegalStateException("Cannot add objects without a factory.");
1576 }
1577 Object obj = _factory.makeObject();
1578 try {
1579 assertOpen();
1580 addObjectToPool(obj, false);
1581 } catch (IllegalStateException ex) { // Pool closed
1582 try {
1583 _factory.destroyObject(obj);
1584 } catch (Exception ex2) {
1585 // swallow
1586 }
1587 throw ex;
1588 }
1589 }
1590
1591 //--- non-public methods ----------------------------------------
1592
1593 /**
1594 * Start the eviction thread or service, or when
1595 * <i>delay</i> is non-positive, stop it
1596 * if it is already running.
1597 *
1598 * @param delay milliseconds between evictor runs.
1599 */
1600 protected synchronized void startEvictor(long delay) {
1601 if(null != _evictor) {
1602 EvictionTimer.cancel(_evictor);
1603 _evictor = null;
1604 }
1605 if(delay > 0) {
1606 _evictor = new Evictor();
1607 EvictionTimer.schedule(_evictor, delay, delay);
1608 }
1609 }
1610
1611 synchronized String debugInfo() {
1612 StringBuffer buf = new StringBuffer();
1613 buf.append("Active: ").append(getNumActive()).append("\n");
1614 buf.append("Idle: ").append(getNumIdle()).append("\n");
1615 buf.append("Idle Objects:\n");
1616 Iterator it = _pool.iterator();
1617 long time = System.currentTimeMillis();
1618 while(it.hasNext()) {
1619 ObjectTimestampPair pair = (ObjectTimestampPair)(it.next());
1620 buf.append("\t").append(pair.value).append("\t").append(time - pair.tstamp).append("\n");
1621 }
1622 return buf.toString();
1623 }
1624
1625 private int getNumTests() {
1626 if(_numTestsPerEvictionRun >= 0) {
1627 return Math.min(_numTestsPerEvictionRun, _pool.size());
1628 } else {
1629 return(int)(Math.ceil(_pool.size()/Math.abs((double)_numTestsPerEvictionRun)));
1630 }
1631 }
1632
1633 //--- inner classes ----------------------------------------------
1634
1635 /**
1636 * The idle object evictor {@link TimerTask}.
1637 * @see GenericObjectPool#setTimeBetweenEvictionRunsMillis
1638 */
1639 private class Evictor extends TimerTask {
1640 public void run() {
1641 try {
1642 evict();
1643 } catch(Exception e) {
1644 // ignored
1645 } catch(OutOfMemoryError oome) {
1646 // Log problem but give evictor thread a chance to continue in
1647 // case error is recoverable
1648 oome.printStackTrace(System.err);
1649 }
1650 try {
1651 ensureMinIdle();
1652 } catch(Exception e) {
1653 // ignored
1654 }
1655 }
1656 }
1657
1658 /**
1659 * A simple "struct" encapsulating the
1660 * configuration information for a {@link GenericObjectPool}.
1661 * @see GenericObjectPool#GenericObjectPool(org.apache.commons.pool.PoolableObjectFactory,
1662 * org.apache.commons.pool.impl.GenericObjectPool.Config)
1663 * @see GenericObjectPool#setConfig
1664 */
1665 public static class Config {
1666 /**
1667 * @see GenericObjectPool#setMaxIdle
1668 */
1669 public int maxIdle = GenericObjectPool.DEFAULT_MAX_IDLE;
1670 /**
1671 * @see GenericObjectPool#setMinIdle
1672 */
1673 public int minIdle = GenericObjectPool.DEFAULT_MIN_IDLE;
1674 /**
1675 * @see GenericObjectPool#setMaxActive
1676 */
1677 public int maxActive = GenericObjectPool.DEFAULT_MAX_ACTIVE;
1678 /**
1679 * @see GenericObjectPool#setMaxWait
1680 */
1681 public long maxWait = GenericObjectPool.DEFAULT_MAX_WAIT;
1682 /**
1683 * @see GenericObjectPool#setWhenExhaustedAction
1684 */
1685 public byte whenExhaustedAction = GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION;
1686 /**
1687 * @see GenericObjectPool#setTestOnBorrow
1688 */
1689 public boolean testOnBorrow = GenericObjectPool.DEFAULT_TEST_ON_BORROW;
1690 /**
1691 * @see GenericObjectPool#setTestOnReturn
1692 */
1693 public boolean testOnReturn = GenericObjectPool.DEFAULT_TEST_ON_RETURN;
1694 /**
1695 * @see GenericObjectPool#setTestWhileIdle
1696 */
1697 public boolean testWhileIdle = GenericObjectPool.DEFAULT_TEST_WHILE_IDLE;
1698 /**
1699 * @see GenericObjectPool#setTimeBetweenEvictionRunsMillis
1700 */
1701 public long timeBetweenEvictionRunsMillis = GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
1702 /**
1703 * @see GenericObjectPool#setNumTestsPerEvictionRun
1704 */
1705 public int numTestsPerEvictionRun = GenericObjectPool.DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
1706 /**
1707 * @see GenericObjectPool#setMinEvictableIdleTimeMillis
1708 */
1709 public long minEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
1710 /**
1711 * @see GenericObjectPool#setSoftMinEvictableIdleTimeMillis
1712 */
1713 public long softMinEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
1714 /**
1715 * @see GenericObjectPool#setLifo
1716 */
1717 public boolean lifo = GenericObjectPool.DEFAULT_LIFO;
1718
1719 }
1720
1721 /**
1722 * Latch used to control allocation order of objects to threads to ensure
1723 * fairness. That is, objects are allocated to threads in the order that
1724 * threads request objects.
1725 */
1726 private static final class Latch {
1727
1728 /** object timestamp pair allocated to this latch */
1729 private ObjectTimestampPair _pair;
1730
1731 /** Wheter or not this latch may create an object instance */
1732 private boolean _mayCreate = false;
1733
1734 /**
1735 * Returns ObjectTimestampPair allocated to this latch
1736 * @return ObjectTimestampPair allocated to this latch
1737 */
1738 private synchronized ObjectTimestampPair getPair() {
1739 return _pair;
1740 }
1741
1742 /**
1743 * Sets ObjectTimestampPair on this latch
1744 * @param pair ObjectTimestampPair allocated to this latch
1745 */
1746 private synchronized void setPair(ObjectTimestampPair pair) {
1747 _pair = pair;
1748 }
1749
1750 /**
1751 * Whether or not this latch may create an object instance
1752 * @return true if this latch has an instance creation permit
1753 */
1754 private synchronized boolean mayCreate() {
1755 return _mayCreate;
1756 }
1757
1758 /**
1759 * Sets the mayCreate property
1760 * @param mayCreate new value for mayCreate
1761 */
1762 private synchronized void setMayCreate(boolean mayCreate) {
1763 _mayCreate = mayCreate;
1764 }
1765
1766 /**
1767 * Reset the latch data. Used when an allocation fails and the latch
1768 * needs to be re-added to the queue.
1769 */
1770 private synchronized void reset() {
1771 _pair = null;
1772 _mayCreate = false;
1773 }
1774 }
1775
1776
1777 //--- private attributes ---------------------------------------
1778
1779 /**
1780 * The cap on the number of idle instances in the pool.
1781 * @see #setMaxIdle
1782 * @see #getMaxIdle
1783 */
1784 private int _maxIdle = DEFAULT_MAX_IDLE;
1785
1786 /**
1787 * The cap on the minimum number of idle instances in the pool.
1788 * @see #setMinIdle
1789 * @see #getMinIdle
1790 */
1791 private int _minIdle = DEFAULT_MIN_IDLE;
1792
1793 /**
1794 * The cap on the total number of active instances from the pool.
1795 * @see #setMaxActive
1796 * @see #getMaxActive
1797 */
1798 private int _maxActive = DEFAULT_MAX_ACTIVE;
1799
1800 /**
1801 * The maximum amount of time (in millis) the
1802 * {@link #borrowObject} method should block before throwing
1803 * an exception when the pool is exhausted and the
1804 * {@link #getWhenExhaustedAction "when exhausted" action} is
1805 * {@link #WHEN_EXHAUSTED_BLOCK}.
1806 *
1807 * When less than or equal to 0, the {@link #borrowObject} method
1808 * may block indefinitely.
1809 *
1810 * @see #setMaxWait
1811 * @see #getMaxWait
1812 * @see #WHEN_EXHAUSTED_BLOCK
1813 * @see #setWhenExhaustedAction
1814 * @see #getWhenExhaustedAction
1815 */
1816 private long _maxWait = DEFAULT_MAX_WAIT;
1817
1818 /**
1819 * The action to take when the {@link #borrowObject} method
1820 * is invoked when the pool is exhausted (the maximum number
1821 * of "active" objects has been reached).
1822 *
1823 * @see #WHEN_EXHAUSTED_BLOCK
1824 * @see #WHEN_EXHAUSTED_FAIL
1825 * @see #WHEN_EXHAUSTED_GROW
1826 * @see #DEFAULT_WHEN_EXHAUSTED_ACTION
1827 * @see #setWhenExhaustedAction
1828 * @see #getWhenExhaustedAction
1829 */
1830 private byte _whenExhaustedAction = DEFAULT_WHEN_EXHAUSTED_ACTION;
1831
1832 /**
1833 * When <tt>true</tt>, objects will be
1834 * {@link PoolableObjectFactory#validateObject validated}
1835 * before being returned by the {@link #borrowObject}
1836 * method. If the object fails to validate,
1837 * it will be dropped from the pool, and we will attempt
1838 * to borrow another.
1839 *
1840 * @see #setTestOnBorrow
1841 * @see #getTestOnBorrow
1842 */
1843 private volatile boolean _testOnBorrow = DEFAULT_TEST_ON_BORROW;
1844
1845 /**
1846 * When <tt>true</tt>, objects will be
1847 * {@link PoolableObjectFactory#validateObject validated}
1848 * before being returned to the pool within the
1849 * {@link #returnObject}.
1850 *
1851 * @see #getTestOnReturn
1852 * @see #setTestOnReturn
1853 */
1854 private volatile boolean _testOnReturn = DEFAULT_TEST_ON_RETURN;
1855
1856 /**
1857 * When <tt>true</tt>, objects will be
1858 * {@link PoolableObjectFactory#validateObject validated}
1859 * by the idle object evictor (if any). If an object
1860 * fails to validate, it will be dropped from the pool.
1861 *
1862 * @see #setTestWhileIdle
1863 * @see #getTestWhileIdle
1864 * @see #getTimeBetweenEvictionRunsMillis
1865 * @see #setTimeBetweenEvictionRunsMillis
1866 */
1867 private boolean _testWhileIdle = DEFAULT_TEST_WHILE_IDLE;
1868
1869 /**
1870 * The number of milliseconds to sleep between runs of the
1871 * idle object evictor thread.
1872 * When non-positive, no idle object evictor thread will be
1873 * run.
1874 *
1875 * @see #setTimeBetweenEvictionRunsMillis
1876 * @see #getTimeBetweenEvictionRunsMillis
1877 */
1878 private long _timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
1879
1880 /**
1881 * The max number of objects to examine during each run of the
1882 * idle object evictor thread (if any).
1883 * <p>
1884 * When a negative value is supplied, <tt>ceil({@link #getNumIdle})/abs({@link #getNumTestsPerEvictionRun})</tt>
1885 * tests will be run. I.e., when the value is <i>-n</i>, roughly one <i>n</i>th of the
1886 * idle objects will be tested per run.
1887 *
1888 * @see #setNumTestsPerEvictionRun
1889 * @see #getNumTestsPerEvictionRun
1890 * @see #getTimeBetweenEvictionRunsMillis
1891 * @see #setTimeBetweenEvictionRunsMillis
1892 */
1893 private int _numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
1894
1895 /**
1896 * The minimum amount of time an object may sit idle in the pool
1897 * before it is eligible for eviction by the idle object evictor
1898 * (if any).
1899 * When non-positive, no objects will be evicted from the pool
1900 * due to idle time alone.
1901 *
1902 * @see #setMinEvictableIdleTimeMillis
1903 * @see #getMinEvictableIdleTimeMillis
1904 * @see #getTimeBetweenEvictionRunsMillis
1905 * @see #setTimeBetweenEvictionRunsMillis
1906 */
1907 private long _minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
1908
1909 /**
1910 * The minimum amount of time an object may sit idle in the pool
1911 * before it is eligible for eviction by the idle object evictor
1912 * (if any), with the extra condition that at least
1913 * "minIdle" amount of object remain in the pool.
1914 * When non-positive, no objects will be evicted from the pool
1915 * due to idle time alone.
1916 *
1917 * @see #setSoftMinEvictableIdleTimeMillis
1918 * @see #getSoftMinEvictableIdleTimeMillis
1919 */
1920 private long _softMinEvictableIdleTimeMillis = DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
1921
1922 /** Whether or not the pool behaves as a LIFO queue (last in first out) */
1923 private boolean _lifo = DEFAULT_LIFO;
1924
1925 /** My pool. */
1926 private CursorableLinkedList _pool = null;
1927
1928 /** Eviction cursor - keeps track of idle object evictor position */
1929 private CursorableLinkedList.Cursor _evictionCursor = null;
1930
1931 /** My {@link PoolableObjectFactory}. */
1932 private PoolableObjectFactory _factory = null;
1933
1934 /**
1935 * The number of objects {@link #borrowObject} borrowed
1936 * from the pool, but not yet returned.
1937 */
1938 private int _numActive = 0;
1939
1940 /**
1941 * My idle object eviction {@link TimerTask}, if any.
1942 */
1943 private Evictor _evictor = null;
1944
1945 /**
1946 * The number of objects subject to some form of internal processing
1947 * (usually creation or destruction) that should be included in the total
1948 * number of objects but are neither active nor idle.
1949 */
1950 private int _numInternalProcessing = 0;
1951
1952 /**
1953 * Used to track the order in which threads call {@link #borrowObject()} so
1954 * that objects can be allocated in the order in which the threads requested
1955 * them.
1956 */
1957 private LinkedList _allocationQueue = new LinkedList();
1958
1959 }