- /*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- package org.apache.commons.dbcp;
-
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
-
- import org.apache.commons.pool.PoolableObjectFactory;
- import org.apache.commons.pool.impl.GenericObjectPool;
-
- /**
- * <p>An implementation of a Jakarta-Commons ObjectPool which
- * tracks JDBC connections and can recover abandoned db connections.
- * If logAbandoned=true, a stack trace will be printed for any
- * abandoned db connections recovered.
- *
- * @author Glenn L. Nielsen
- * @version $Revision: 1.16 $ $Date: 2004/05/01 12:42:19 $
- * @deprecated This will be removed in a future version of DBCP.
- */
- public class AbandonedObjectPool extends GenericObjectPool {
-
- // DBCP AbandonedConfig
- private AbandonedConfig config = null;
- // A list of connections in use
- private List trace = new ArrayList();
-
- /**
- * Create an ObjectPool which tracks db connections.
- *
- * @param PoolableObjectFactory factory used to create this
- * @param AbandonedConfig configuration for abandoned db connections
- */
- public AbandonedObjectPool(PoolableObjectFactory factory,
- AbandonedConfig config) {
- super(factory);
- this.config = config;
- System.out.println("AbandonedObjectPool is used (" + this + ")");
- System.out.println(" LogAbandoned: " + config.getLogAbandoned());
- System.out.println(" RemoveAbandoned: " + config.getRemoveAbandoned());
- System.out.println(" RemoveAbandonedTimeout: " + config.getRemoveAbandonedTimeout());
- }
-
- /**
- * Get a db connection from the pool.
- *
- * If removeAbandoned=true, recovers db connections which
- * have been idle > removeAbandonedTimeout.
- *
- * @return Object jdbc Connection
- */
- public Object borrowObject() throws Exception {
- if (config != null
- && config.getRemoveAbandoned()
- && (getNumIdle() < 2)
- && (getNumActive() > getMaxActive() - 3) ) {
- removeAbandoned();
- }
- Object obj = super.borrowObject();
- if(obj instanceof AbandonedTrace) {
- ((AbandonedTrace)obj).setStackTrace();
- }
- if (obj != null && config != null && config.getRemoveAbandoned()) {
- synchronized(trace) {
- trace.add(obj);
- }
- }
- return obj;
- }
-
- /**
- * Return a db connection to the pool.
- *
- * @param Object db Connection to return
- */
- public void returnObject(Object obj) throws Exception {
- if (config != null && config.getRemoveAbandoned()) {
- synchronized(trace) {
- boolean foundObject = trace.remove(obj);
- if (!foundObject) {
- return; // This connection has already been invalidated. Stop now.
- }
- }
- }
- super.returnObject(obj);
- }
-
- public void invalidateObject(Object obj) throws Exception {
- if (config != null && config.getRemoveAbandoned()) {
- synchronized(trace) {
- boolean foundObject = trace.remove(obj);
- if (!foundObject) {
- return; // This connection has already been invalidated. Stop now.
- }
- }
- }
- super.invalidateObject(obj);
- }
-
- /**
- * Recover abandoned db connections which have been idle
- * greater than the removeAbandonedTimeout.
- */
- private void removeAbandoned() {
- // Generate a list of abandoned connections to remove
- long now = System.currentTimeMillis();
- long timeout = now - (config.getRemoveAbandonedTimeout() * 1000);
- ArrayList remove = new ArrayList();
- synchronized(trace) {
- Iterator it = trace.iterator();
- while (it.hasNext()) {
- AbandonedTrace pc = (AbandonedTrace)it.next();
- if (pc.getLastUsed() > timeout) {
- continue;
- }
- if (pc.getLastUsed() > 0) {
- remove.add(pc);
- }
- }
- }
-
- // Now remove the abandoned connections
- Iterator it = remove.iterator();
- while (it.hasNext()) {
- AbandonedTrace pc = (AbandonedTrace)it.next();
- if (config.getLogAbandoned()) {
- pc.printStackTrace();
- }
- try {
- invalidateObject(pc);
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- }