ingo@1127: /* ingo@1127: * Copyright (c) 2010 by Intevation GmbH ingo@1127: * ingo@1127: * This program is free software under the LGPL (>=v2.1) ingo@1127: * Read the file LGPL.txt coming with the software for details ingo@1127: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1127: */ ingo@1127: tim@130: package de.intevation.gnv.geobackend.sde.connectionpool; tim@130: tim@130: import java.sql.Connection; tim@130: import java.util.Properties; tim@130: tim@130: import org.apache.commons.pool.PoolableObjectFactory; tim@130: import org.apache.commons.pool.impl.GenericObjectPool; tim@889: import org.apache.log4j.Logger; sascha@886: tim@889: import de.intevation.gnv.geobackend.base.connectionpool.ConnectionPool; tim@889: import de.intevation.gnv.geobackend.base.connectionpool.exception.ConnectionException; tim@130: tim@130: /** tim@130: *This is the ArcSDE specific implementation of the Interface ConnectionPool sascha@885: * sascha@887: * @author Tim Englich tim@130: */ tim@130: public class ArcSDEConnectionPool implements ConnectionPool { tim@130: tim@265: /** tim@130: * the logger, used to log exceptions and additonaly information tim@130: */ tim@265: private static Logger log = Logger tim@265: .getLogger(ArcSDEPoolableObjectFactory.class); tim@130: tim@265: /** tim@265: * The Pool which stores the Connections to the ArcSDE Backend tim@265: */ tim@265: private GenericObjectPool pool = null; tim@265: tim@265: /** tim@889: * @see de.intevation.gnv.geobackend.base.connectionpool.ConnectionPool#closeConnection(java.sql.Connection) tim@265: */ tim@265: public void closeConnection(Connection connection) tim@265: throws ConnectionException { tim@265: try { tim@265: this.pool.returnObject(connection); tim@265: } catch (Exception e) { tim@265: log.error(e, e); tim@265: throw new ConnectionException(e); tim@265: } tim@265: tim@265: } tim@265: tim@265: /** tim@265: * @see de.intevation.gnv.geobackend.base.connectionpool.ConnectionPool#getConnection(java.lang.String) tim@265: */ tim@265: public synchronized Connection getConnection(String connectionID) tim@265: throws ConnectionException { tim@265: try { tim@265: Object object = this.pool.borrowObject(); tim@265: tim@265: if (object instanceof Connection) { tim@265: return (Connection) object; tim@265: } else { tim@265: throw new ConnectionException( tim@265: "Created Object is not an java.sql.Connection"); tim@265: } tim@265: tim@265: } catch (Exception e) { tim@265: log.error(e, e); tim@265: throw new ConnectionException(e); tim@265: } tim@265: } tim@265: tim@265: /** tim@265: * @see de.intevation.gnv.geobackend.base.connectionpool.ConnectionPool#initialize(java.util.Properties) tim@265: */ tim@265: public void initialize(Properties properties) { tim@265: log.info("ArcSDEConnectionPool.initialize has been called"); tim@265: log.info("ConnectionPool will be initialized"); tim@265: tim@265: PoolableObjectFactory poolableObjectFactory = new ArcSDEPoolableObjectFactory( tim@265: properties); tim@265: tim@265: int maxActive = Integer.parseInt(properties.getProperty("maxActive", tim@265: "10")); tim@265: long maxWait = Long.parseLong(properties.getProperty("maxWait", tim@265: "" + GenericObjectPool.DEFAULT_MAX_WAIT)); tim@265: int maxIdle = Integer.parseInt(properties.getProperty("maxIdle", tim@265: "" + GenericObjectPool.DEFAULT_MAX_IDLE)); tim@265: int minIdle = Integer.parseInt(properties.getProperty("minIdle", tim@265: "" + GenericObjectPool.DEFAULT_MIN_IDLE)); tim@265: boolean testOnBorrow = Boolean.parseBoolean(properties.getProperty( tim@265: "testOnBorrow", "" + GenericObjectPool.DEFAULT_TEST_ON_BORROW)); tim@265: boolean testOnReturn = Boolean.parseBoolean(properties.getProperty( tim@265: "testOnReturn", "" + GenericObjectPool.DEFAULT_TEST_ON_RETURN)); tim@265: long timeBetweenEvictionRunsMillis = Long tim@265: .parseLong(properties tim@265: .getProperty( tim@265: "timeBetweenEvictionRunsMillis", tim@265: "" tim@265: + GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS)); tim@265: int numTestsPerEvictionRun = Integer.parseInt(properties.getProperty( tim@265: "numTestsPerEvictionRun", tim@265: "" + GenericObjectPool.DEFAULT_NUM_TESTS_PER_EVICTION_RUN)); tim@265: long minEvictableIdleTimeMillis = Long tim@265: .parseLong(properties tim@265: .getProperty( tim@265: "minEvictableIdleTimeMillis", tim@265: "" tim@265: + GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS)); tim@265: boolean testWhileIdle = Boolean.parseBoolean(properties tim@265: .getProperty("testWhileIdle", tim@265: "" + GenericObjectPool.DEFAULT_TEST_WHILE_IDLE)); sascha@885: tim@265: log.info("Maximum Number of active Connections: " + maxActive); tim@265: log.info("Maximum Number of waiting: " + maxWait); tim@265: log.info("Maximum Number of idle: " + maxIdle); tim@265: log.info("Minimum Number of idle: " + minIdle); tim@265: log.info("TestOnBorrow: " + testOnBorrow); tim@265: log.info("TestOnReturn: " + testOnReturn); tim@265: log.info("TimeBetweenEvictionRunsMillis: " + timeBetweenEvictionRunsMillis); tim@265: log.info("NumTestsPerEvictionRun: " + numTestsPerEvictionRun); tim@265: log.info("MinEvictableIdleTimeMillis: " + minEvictableIdleTimeMillis); tim@265: log.info("TestWhileIdle: " + testWhileIdle); sascha@885: tim@265: this.pool = new GenericObjectPool(poolableObjectFactory, maxActive, tim@265: GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, maxWait, tim@265: maxIdle, minIdle, testOnBorrow, testOnReturn, tim@265: timeBetweenEvictionRunsMillis, numTestsPerEvictionRun, tim@265: minEvictableIdleTimeMillis, testWhileIdle); tim@130: } tim@130: }