Author: psteitz Date: Sun Apr 11 22:39:56 2021 New Revision: 1888642 URL: http://svn.apache.org/viewvc?rev=1888642&view=rev Log: Dropped support for 1.x versions of pool and dbcp.
Added: commons/sandbox/performance/trunk/src/http/build.properties.sample Removed: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/WaiterFactory.java Modified: commons/sandbox/performance/trunk/pom.xml commons/sandbox/performance/trunk/src/dbcp/build.properties.sample commons/sandbox/performance/trunk/src/dbcp/build.xml commons/sandbox/performance/trunk/src/dbcp/config-dbcp.xml commons/sandbox/performance/trunk/src/http/build.xml commons/sandbox/performance/trunk/src/http/config-http.xml commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPClientThread.java commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPSoak.java commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java commons/sandbox/performance/trunk/src/pool/build.properties.sample commons/sandbox/performance/trunk/src/pool/build.xml commons/sandbox/performance/trunk/src/site/apt/index.apt commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/PoolSoakTest.java commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/WaiterTest.java commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/config-pool.xml Modified: commons/sandbox/performance/trunk/pom.xml URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/pom.xml?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/pom.xml (original) +++ commons/sandbox/performance/trunk/pom.xml Sun Apr 11 22:39:56 2021 @@ -53,20 +53,10 @@ <artifactId>commons-digester</artifactId> <version>2.1</version> </dependency> - <dependency> - <groupId>commons-dbcp</groupId> - <artifactId>commons-dbcp</artifactId> - <version>1.3</version> - </dependency> - <dependency> - <groupId>commons-pool</groupId> - <artifactId>commons-pool</artifactId> - <version>1.5.6</version> - </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-math3</artifactId> - <version>3.2</version> + <version>3.6.1</version> </dependency> <dependency> <groupId>commons-httpclient</groupId> @@ -76,7 +66,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>4.11</version> + <version>4.12</version> <scope>test</scope> </dependency> <dependency> Modified: commons/sandbox/performance/trunk/src/dbcp/build.properties.sample URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/dbcp/build.properties.sample?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/dbcp/build.properties.sample (original) +++ commons/sandbox/performance/trunk/src/dbcp/build.properties.sample Sun Apr 11 22:39:56 2021 @@ -16,8 +16,10 @@ # limitations under the License. ############################################################################### +# Copied unchanged from DBCP 2.0 release tag (DBCP_2_0) + # Remote maven repository (used to download dependencies not provided below) -mavenRepo=http://repo1.maven.org/maven2 +mavenRepo=https://repo1.maven.org/maven2 # Local maven repo (not needed if full paths are provided below) localMavenRepo=${user.home}/.m2/repository @@ -26,12 +28,10 @@ localMavenRepo=${user.home}/.m2/reposito # Uncomment to use a real mysql database #jdbc-jar=${localMavenRepo}/mysql/mysql-connector-java/5.0.2/mysql-connector-java-5.0.2.jar # DBCP mocks - no real database access or latency. Build from source using "ant mock-jar" from DBCP trunk. -jdbc-jar=./commons-dbcp2-2.0-mocks.jar +#jdbc-jar=./commons-dbcp2-2.0-mocks.jar # Replace with full path to versions of pool, dbcp jars you want to test with -pool-jar=${localMavenRepo}/commons-pool/commons-pool/1.5.6/commons-pool-1.5.6.jar -dbcp-jar=${localMavenRepo}/commons-dbcp/commons-dbcp/1.4/commons-dbcp-1.4.jar pool2-jar=${localMavenRepo}/org/apache/commons/commons-pool2/2.2/commons-pool2-2.2.jar dbcp2-jar=${localMavenRepo}/org/apache/commons/commons-dbcp2/2.0/commons-dbcp2-2.0.jar tomcat-jdbc-jar=${localMavenRepo}/org/apache/tomcat/tomcat-jdbc/8.0.3/tomcat-jdbc-8.0.3.jar Modified: commons/sandbox/performance/trunk/src/dbcp/build.xml URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/dbcp/build.xml?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/dbcp/build.xml (original) +++ commons/sandbox/performance/trunk/src/dbcp/build.xml Sun Apr 11 22:39:56 2021 @@ -29,9 +29,6 @@ <property file="${component-propfile}"/> <path id="compile.classpath"> - <pathelement location="${jdbc-jar}"/> - <pathelement location="${pool-jar}"/> - <pathelement location="${dbcp-jar}"/> <pathelement location="${pool2-jar}"/> <pathelement location="${dbcp2-jar}"/> <pathelement location="${tomcat-jdbc-jar}"/> @@ -87,9 +84,17 @@ dest="${lib}/commons-logging-1.0.4.jar" usetimestamp="true"/> </target> + + <!-- Grab dbcp tests jar to get the mock jdbc driver --> + <target name="get-dbcp-tests"> + <get + src="${mavenRepo}/org/apache/commons/commons-dbcp2/2.8.0/commons-dbcp2-2.8.0-tests.jar" + dest="${lib}/commons-dbcp2-2.8.0-tests.jar" + usetimestamp="true"/> + </target> <target name="get-deps" - depends="get-collections,get-beanutils,get-digester,get-math,get-logging"> + depends="get-collections,get-beanutils,get-digester,get-math,get-logging,get-dbcp-tests"> </target> <target name="compile" depends="clean,init,get-deps"> Modified: commons/sandbox/performance/trunk/src/dbcp/config-dbcp.xml URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/dbcp/config-dbcp.xml?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/dbcp/config-dbcp.xml (original) +++ commons/sandbox/performance/trunk/src/dbcp/config-dbcp.xml Sun Apr 11 22:39:56 2021 @@ -23,7 +23,7 @@ <database> <driver>org.apache.commons.dbcp2.TesterDriver</driver> <url>jdbc:apache:commons:testdriver</url> - <username>username</username> + <username>userName</username> <password>password</password> <!-- no-op, integerIndexed, integerScan, or textScan --> <query-type>integerIndexed</query-type> @@ -50,7 +50,7 @@ <pool> <!-- GenericObjectPool or AbandonedObjectPool --> - <type>GenericObjectPool</type> + <type>GenericObjectPool2</type> <max-active>15</max-active> <max-idle>15</max-idle> <min-idle>3</min-idle> @@ -66,13 +66,6 @@ <sampling-rate>0.1</sampling-rate> </pool> - <!-- Ignored unless pool type is AbandonedObjectPool --> - <abandoned-config> - <log-abandoned>true</log-abandoned> - <remove-abandoned>true</remove-abandoned> - <abandoned-timeout>50000</abandoned-timeout> - </abandoned-config> - <run> <iterations>1000</iterations> <clients>50</clients> Added: commons/sandbox/performance/trunk/src/http/build.properties.sample URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/http/build.properties.sample?rev=1888642&view=auto ============================================================================== --- commons/sandbox/performance/trunk/src/http/build.properties.sample (added) +++ commons/sandbox/performance/trunk/src/http/build.properties.sample Sun Apr 11 22:39:56 2021 @@ -0,0 +1,22 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +############################################################################### + +# Remote maven repository (used to download dependencies not provided below) +mavenRepo=https://repo1.maven.org/maven2 + + Modified: commons/sandbox/performance/trunk/src/http/build.xml URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/http/build.xml?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/http/build.xml (original) +++ commons/sandbox/performance/trunk/src/http/build.xml Sun Apr 11 22:39:56 2021 @@ -71,8 +71,8 @@ <target name="get-math"> <get - src="${mavenRepo}/org/apache/commons/commons-math/2.1/commons-math-2.1.jar" - dest="${lib}/commons-math-2.1.jar" + src="${mavenRepo}/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar" + dest="${lib}/commons-math-3.6.1.jar" usetimestamp="true"/> </target> Modified: commons/sandbox/performance/trunk/src/http/config-http.xml URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/http/config-http.xml?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/http/config-http.xml (original) +++ commons/sandbox/performance/trunk/src/http/config-http.xml Sun Apr 11 22:39:56 2021 @@ -39,9 +39,13 @@ <cycle-type>oscillating</cycle-type> </run> <http> - <url>http://localhost:8080/DBTest/test.jsp</url><!--GET or POST--> - <method>GET</method><!--Socket timeout in milliseconds--> - <socket-timeout>20000</socket-timeout><!--String to search for in response--> - <success-key>updated</success-key></http> - + <!-- URL to hit --> + <url>http://localhost:8080</url> + <!--GET or POST--> + <method>GET</method> + <!--Socket timeout in milliseconds--> + <socket-timeout>20000</socket-timeout> + <!--String to search for in response--> + <success-key>Tomcat</success-key> + </http> </configuration> Modified: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPClientThread.java URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPClientThread.java?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPClientThread.java (original) +++ commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPClientThread.java Sun Apr 11 22:39:56 2021 @@ -21,6 +21,7 @@ import java.util.logging.Logger; import javax.sql.DataSource; +import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.math3.stat.descriptive.SummaryStatistics; import org.apache.commons.performance.ClientThread; import org.apache.commons.performance.Statistics; @@ -62,10 +63,7 @@ public class DBCPClientThread /** Sampling rate for numActive, numIdle */ private double samplingRate; - // Cast targets to query for stats - org.apache.commons.dbcp.BasicDataSource dbcp1DS = null; - - org.apache.commons.dbcp2.BasicDataSource dbcp2DS = null; + BasicDataSource dbcp2DS = null; org.apache.tomcat.jdbc.pool.DataSource tomcatDS = null; @@ -99,12 +97,9 @@ public class DBCPClientThread this.dataSource = dataSource; - if (dataSource instanceof org.apache.commons.dbcp.BasicDataSource) { - type = DataSourceType.DBCP1; - dbcp1DS = (org.apache.commons.dbcp.BasicDataSource) dataSource; - } else if (dataSource instanceof org.apache.commons.dbcp2.BasicDataSource) { + if (dataSource instanceof BasicDataSource) { type = DataSourceType.DBCP2; - dbcp2DS = (org.apache.commons.dbcp2.BasicDataSource) dataSource; + dbcp2DS = (BasicDataSource) dataSource; } else { type = DataSourceType.TOMCAT; tomcatDS = (org.apache.tomcat.jdbc.pool.DataSource) dataSource; @@ -174,10 +169,6 @@ public class DBCPClientThread int numIdle; int numActive; switch (type) { - case DBCP1: - numActive = dbcp1DS.getNumActive(); - numIdle = dbcp1DS.getNumIdle(); - break; case DBCP2: numActive = dbcp2DS.getNumActive(); numIdle = dbcp2DS.getNumIdle(); @@ -205,7 +196,7 @@ public class DBCPClientThread } private enum DataSourceType { - DBCP1, DBCP2, TOMCAT + DBCP2, TOMCAT } } Modified: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPSoak.java URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPSoak.java?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPSoak.java (original) +++ commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/dbcp/DBCPSoak.java Sun Apr 11 22:39:56 2021 @@ -17,28 +17,26 @@ package org.apache.commons.performance.d import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; +import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import java.util.logging.Logger; import javax.sql.DataSource; -import org.apache.commons.dbcp.AbandonedConfig; -import org.apache.commons.dbcp.ConnectionFactory; -import org.apache.commons.dbcp.DriverConnectionFactory; -import org.apache.commons.dbcp.DriverManagerConnectionFactory; -import org.apache.commons.dbcp.PoolableConnectionFactory; -import org.apache.commons.dbcp.PoolingDataSource; +import org.apache.commons.dbcp2.BasicDataSource; +import org.apache.commons.dbcp2.ConnectionFactory; +import org.apache.commons.dbcp2.DriverConnectionFactory; +import org.apache.commons.dbcp2.DriverManagerConnectionFactory; +import org.apache.commons.dbcp2.PoolableConnectionFactory; +import org.apache.commons.dbcp2.PoolingDataSource; import org.apache.commons.math3.random.RandomDataGenerator; import org.apache.commons.performance.ClientThread; import org.apache.commons.performance.ConfigurationException; import org.apache.commons.performance.LoadGenerator; import org.apache.commons.performance.Statistics; -import org.apache.commons.pool.KeyedObjectPoolFactory; -import org.apache.commons.pool.PoolableObjectFactory; -import org.apache.commons.pool.impl.GenericKeyedObjectPool; -import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory; -import org.apache.commons.pool.impl.GenericObjectPool; +import org.apache.commons.pool2.impl.AbandonedConfig; +import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.tomcat.jdbc.pool.PoolProperties; /** @@ -112,6 +110,29 @@ public class DBCPSoak private DataSource dataSource; + private PoolableConnectionFactory + createPoolableConnectionFactory(final ConnectionFactory driverConnectionFactory) + throws SQLException { + PoolableConnectionFactory connectionFactory = null; + try { + connectionFactory = new PoolableConnectionFactory(driverConnectionFactory, + null); + connectionFactory.setValidationQuery(validationQuery); + + connectionFactory.setDefaultReadOnly(readOnly); + connectionFactory.setDefaultAutoCommit(autocommit); + + connectionFactory.setPoolStatements(poolPreparedStatements); + + } catch (final RuntimeException e) { + throw e; + } catch (final Exception e) { + throw new SQLException("Cannot create PoolableConnectionFactory (" + + e.getMessage() + ")", e); + } + return connectionFactory; + } + /** * Create connection pool and, if necessary, test table. */ @@ -119,36 +140,8 @@ public class DBCPSoak protected void init() throws Exception { - if (dataSourceType.equals("BasicDataSource")) { - org.apache.commons.dbcp.BasicDataSource bds = new org.apache.commons.dbcp.BasicDataSource(); - bds.setDefaultAutoCommit(autocommit); - bds.setPassword(connectPassword); - bds.setUrl(connectUrl); - bds.setUsername(connectUser); - bds.setDriverClassName(driverClass); - bds.setMinEvictableIdleTimeMillis(idleTimeout); - bds.setMaxActive(maxActive); - bds.setMaxIdle(maxIdle); - bds.setMaxWait(maxWait); - bds.setMinIdle(minIdle); - bds.setPoolPreparedStatements(poolPreparedStatements); - bds.setDefaultReadOnly(readOnly); - bds.setTestOnBorrow(testOnBorrow); - bds.setTestOnReturn(testOnReturn); - bds.setTestWhileIdle(testWhileIdle); - bds.setNumTestsPerEvictionRun(testsPerEviction); - bds.setTimeBetweenEvictionRunsMillis(timeBetweenEvictions); - bds.setValidationQuery(validationQuery); - if (poolType.equals("AbandonedObjectPool")) { - bds.setRemoveAbandoned(true); - } - dataSource = bds; - checkDatabase(); - return; - } - if (dataSourceType.equals("BasicDataSource2")) { - org.apache.commons.dbcp2.BasicDataSource bds = new org.apache.commons.dbcp2.BasicDataSource(); + BasicDataSource bds = new BasicDataSource(); bds.setDefaultAutoCommit(autocommit); bds.setPassword(connectPassword); bds.setUrl(connectUrl); @@ -200,28 +193,6 @@ public class DBCPSoak Class.forName(driverClass); - // Create object pool - if (poolType.equals("GenericObjectPool")) { - connectionPool = new org.apache.commons.pool.impl.GenericObjectPool(null, - maxActive, - exhaustedAction, - maxWait, - maxIdle, - minIdle, - testOnBorrow, - testOnReturn, - timeBetweenEvictions, - testsPerEviction, - idleTimeout, - testWhileIdle); - } else if (poolType.equals("AbandonedObjectPool")) { - connectionPool = new org.apache.commons.dbcp.AbandonedObjectPool(null, - abandonedConfig); - } else { - throw new ConfigurationException("invalid pool type configuration: " + - poolType); - } - // Create raw connection factory ConnectionFactory connectionFactory = null; if (driverType.equals("DriverManager")) { @@ -238,31 +209,9 @@ public class DBCPSoak throw new ConfigurationException("Bad config setting for driver type"); } - // Create object factory - PoolableObjectFactory poolableConnectionFactory = null; - KeyedObjectPoolFactory statementPoolFactory = null; - if (poolPreparedStatements) { // Use same defaults as BasicDataSource - statementPoolFactory = new GenericKeyedObjectPoolFactory(null, -1, // unlimited - // maxActive - // (per - // key) - GenericKeyedObjectPool.WHEN_EXHAUSTED_FAIL, - 0, // maxWait - 1, // maxIdle - // (per - // key) - maxOpenStatements); // TODO: - // make - // all - // configurable - } + PoolableConnectionFactory poolableConnectionFactory = null; if (factoryType.equals("PoolableConnectionFactory")) { - poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, - connectionPool, - statementPoolFactory, - validationQuery, - readOnly, - autocommit); + poolableConnectionFactory = createPoolableConnectionFactory(connectionFactory); } else if (factoryType.equals("CPDSConnectionFactory")) { throw new ConfigurationException("CPDSConnectionFactory not implemented yet"); } else { @@ -270,6 +219,20 @@ public class DBCPSoak factoryType); } + // Create object pool + connectionPool = new GenericObjectPool(poolableConnectionFactory); + connectionPool.setMaxTotal(maxActive); + connectionPool.setMaxWaitMillis(maxWait); + connectionPool.setMaxIdle(maxIdle); + connectionPool.setMinIdle(minIdle); + connectionPool.setTimeBetweenEvictionRunsMillis(timeBetweenEvictions); + connectionPool.setNumTestsPerEvictionRun(testsPerEviction); + connectionPool.setMinEvictableIdleTimeMillis(idleTimeout); + connectionPool.setTestWhileIdle(testWhileIdle); + connectionPool.setTestOnBorrow(testOnBorrow); + connectionPool.setBlockWhenExhausted(autocommit); + connectionPool.setTestOnReturn(testOnReturn); + // Create DataSource dataSource = new PoolingDataSource(connectionPool); checkDatabase(); @@ -303,12 +266,10 @@ public class DBCPSoak @Override protected void cleanUp() throws Exception { - if (dataSourceType.equals("BasicDataSource")) { - ((org.apache.commons.dbcp.BasicDataSource) dataSource).close(); - } else if (dataSourceType.equals("tomcat-jdbc-pool")) { + if (dataSourceType.equals("tomcat-jdbc-pool")) { ((org.apache.tomcat.jdbc.pool.DataSource) dataSource).close(); } else { - ((org.apache.commons.dbcp2.BasicDataSource) dataSource).close(); + ((BasicDataSource) dataSource).close(); } } @@ -381,16 +342,6 @@ public class DBCPSoak this.idleTimeout = Long.parseLong(idleTimeout); this.testWhileIdle = Boolean.parseBoolean(testWhileIdle); this.poolType = type; - if (exhaustedAction.equals("block")) { - this.exhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK; - } else if (exhaustedAction.equals("fail")) { - this.exhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_FAIL; - } else if (exhaustedAction.equals("grow")) { - this.exhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_GROW; - } else { - throw new ConfigurationException("Bad configuration setting for exhausted action: " + - exhaustedAction); - } this.samplingRate = Double.parseDouble(samplingRate); } @@ -398,8 +349,8 @@ public class DBCPSoak String removeAbandoned, String abandonedTimeout) { abandonedConfig.setLogAbandoned(Boolean.parseBoolean(logAbandoned)); - abandonedConfig - .setRemoveAbandoned(Boolean.parseBoolean(removeAbandoned)); + abandonedConfig.setRemoveAbandonedOnMaintenance(Boolean + .parseBoolean(removeAbandoned)); abandonedConfig .setRemoveAbandonedTimeout(Integer.parseInt(abandonedTimeout)); } Modified: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java (original) +++ commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java Sun Apr 11 22:39:56 2021 @@ -1,18 +1,15 @@ /* * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You 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.performance.pool; @@ -21,41 +18,38 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -//import org.apache.commons.pool.ObjectPool; -//import org.apache.commons.pool2.ObjectPool; -//import org.apache.commons.pool.KeyedObjectPool; -//import org.apache.commons.pool2.KeyedObjectPool; +// import org.apache.commons.pool.ObjectPool; +// import org.apache.commons.pool2.ObjectPool; +// import org.apache.commons.pool.KeyedObjectPool; +// import org.apache.commons.pool2.KeyedObjectPool; import org.apache.commons.math3.random.RandomDataGenerator; import org.apache.commons.math3.stat.descriptive.SummaryStatistics; import org.apache.commons.performance.ClientThread; import org.apache.commons.performance.Statistics; +import org.apache.commons.pool2.KeyedObjectPool; +import org.apache.commons.pool2.ObjectPool; /** * <p> - * Client thread that borrows and returns objects from a pool in a loop. See {@link ClientThread - * ClientThread javadoc} for a description of how times between requests are computed. In addition - * to request latency, pool numIdle and numActive statistics and stats on instance idle time are - * tracked. Constructors are provided for both 1.x and version 2 simple and keyed pools. + * Client thread that borrows and returns objects from a pool in a loop. See + * {@link ClientThread ClientThread javadoc} for a description of how times + * between requests are computed. In addition to request latency, pool numIdle + * and numActive statistics and stats on instance idle time are tracked. + * Constructors are provided for both 1.x and version 2 simple and keyed pools. * </p> - * * <p> * Note that this class is *not* threadsafe. * </p> */ public class PoolClientThread - extends ClientThread { - - /** Version 1.x object pool (if keyed = false) */ - private final org.apache.commons.pool.ObjectPool pool; - - /** Version 1.x keyed pool (if keyed = true) */ - private final org.apache.commons.pool.KeyedObjectPool keyedPool; + extends + ClientThread { /** Version 2 object pool (if keyed = false) */ - private final org.apache.commons.pool2.ObjectPool<Waiter> pool2; + private final ObjectPool<Waiter> pool2; /** Version 2 keyed pool (if keyed = true) */ - private final org.apache.commons.pool2.KeyedObjectPool<Integer, Waiter> keyedPool2; + private final KeyedObjectPool<Integer, Waiter> keyedPool2; /** Whether or not pool being tested is keyed */ private boolean keyed; @@ -78,79 +72,10 @@ public class PoolClientThread /** Statistics on instance idle time */ private SummaryStatistics instanceIdleTimeStats = new SummaryStatistics(); - /** Just-borrowed Waiter instance (used to grab idle time stats in cleanUp) */ - private Waiter waiter = null; - /** - * Create a pool client thread for a version 1.x ObjectPool. - * - * @param iterations number of iterations - * @param minDelay minimum mean time between client requests - * @param maxDelay maximum mean time between client requests - * @param delayType distribution of time between client requests - * @param rampPeriod ramp period of cycle for cyclic load - * @param peakPeriod peak period of cycle for cyclic load - * @param troughPeriod trough period of cycle for cyclic load - * @param cycleType type of cycle for mean delay - * @param rampType type of ramp (linear or random jumps) - * @param logger common logger shared by all clients - * @param stats Statistics container - * @param pool ObjectPool - * @param samplingRate proportion of requests for which numIdle and numActive will be sampled - * for statistical analysis + * Just-borrowed Waiter instance (used to grab idle time stats in cleanUp) */ - public PoolClientThread(long iterations, long minDelay, long maxDelay, double sigma, String delayType, - long rampPeriod, long peakPeriod, long troughPeriod, String cycleType, String rampType, - Logger logger, Statistics stats, org.apache.commons.pool.ObjectPool pool, - double samplingRate) { - - super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, troughPeriod, cycleType, - rampType, logger, stats); - this.pool = pool; - this.pool2 = null; - this.keyedPool2 = null; - this.keyedPool = null; - this.keyed = false; - this.samplingRate = samplingRate; - } - - /** - * Create a pool client thread for a version 1.x KeyedObjectPool. - * - * @param iterations number of iterations - * @param minDelay minimum mean time between client requests - * @param maxDelay maximum mean time between client requests - * @param delayType distribution of time between client requests - * @param rampPeriod ramp period of cycle for cyclic load - * @param peakPeriod peak period of cycle for cyclic load - * @param troughPeriod trough period of cycle for cyclic load - * @param cycleType type of cycle for mean delay - * @param rampType type of ramp (linear or random jumps) - * @param logger common logger shared by all clients - * @param stats Statistics container - * @param keyedPool KeyedObjectPool - * @param samplingRate proportion of requests for which numIdle and numActive will be sampled - * for statistical analysis - */ - public PoolClientThread(long iterations, long minDelay, long maxDelay, double sigma, String delayType, - long rampPeriod, long peakPeriod, long troughPeriod, String cycleType, String rampType, - Logger logger, Statistics stats, org.apache.commons.pool.KeyedObjectPool keyedPool, - double samplingRate) { - - super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, troughPeriod, cycleType, - rampType, logger, stats); - - this.keyedPool = keyedPool; - this.pool = null; - this.pool2 = null; - this.keyedPool2 = null; - this.keyed = true; - this.samplingRate = samplingRate; - keys = new ArrayList<Integer>(); - for (int i = 0; i < 20; i++) { // TODO: make number of keys configurable - keys.add(new Integer(i)); - } - } + private Waiter waiter = null; /** * Create a pool client thread for a version 1.x ObjectPool. @@ -167,20 +92,20 @@ public class PoolClientThread * @param logger common logger shared by all clients * @param stats Statistics container * @param pool ObjectPool - * @param samplingRate proportion of requests for which numIdle and numActive will be sampled - * for statistical analysis + * @param samplingRate proportion of requests for which numIdle and + * numActive will be sampled for statistical analysis */ - public PoolClientThread(long iterations, long minDelay, long maxDelay, double sigma, String delayType, - long rampPeriod, long peakPeriod, long troughPeriod, String cycleType, String rampType, - Logger logger, Statistics stats, org.apache.commons.pool2.ObjectPool<Waiter> pool, + public PoolClientThread(long iterations, long minDelay, long maxDelay, + double sigma, String delayType, long rampPeriod, + long peakPeriod, long troughPeriod, + String cycleType, String rampType, Logger logger, + Statistics stats, ObjectPool<Waiter> pool, double samplingRate) { - super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, troughPeriod, cycleType, - rampType, logger, stats); + super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, + peakPeriod, troughPeriod, cycleType, rampType, logger, stats); this.pool2 = pool; - this.pool = null; this.keyedPool2 = null; - this.keyedPool = null; this.keyed = false; this.samplingRate = samplingRate; } @@ -200,21 +125,22 @@ public class PoolClientThread * @param logger common logger shared by all clients * @param stats Statistics container * @param keyedPool KeyedObjectPool - * @param samplingRate proportion of requests for which numIdle and numActive will be sampled - * for statistical analysis + * @param samplingRate proportion of requests for which numIdle and + * numActive will be sampled for statistical analysis */ - public PoolClientThread(long iterations, long minDelay, long maxDelay, double sigma, String delayType, - long rampPeriod, long peakPeriod, long troughPeriod, String cycleType, String rampType, - Logger logger, Statistics stats, - org.apache.commons.pool2.KeyedObjectPool<Integer, Waiter> keyedPool, double samplingRate) { + public PoolClientThread(long iterations, long minDelay, long maxDelay, + double sigma, String delayType, long rampPeriod, + long peakPeriod, long troughPeriod, + String cycleType, String rampType, Logger logger, + Statistics stats, + KeyedObjectPool<Integer, Waiter> keyedPool, + double samplingRate) { - super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, troughPeriod, cycleType, - rampType, logger, stats); + super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, + peakPeriod, troughPeriod, cycleType, rampType, logger, stats); this.keyedPool2 = keyedPool; - this.pool = null; this.pool2 = null; - this.keyedPool = null; this.keyed = true; this.samplingRate = samplingRate; keys = new ArrayList<Integer>(); @@ -229,21 +155,13 @@ public class PoolClientThread throws Exception { if (keyed) { Integer key = keys.get(randomData.nextInt(0, 19)); - waiter = keyedPool2 == null ? (Waiter) keyedPool.borrowObject(key) : keyedPool2.borrowObject(key); + waiter = keyedPool2.borrowObject(key); waiter.doWait(); - if (keyedPool2 == null) { - keyedPool.returnObject(key, waiter); - } else { - keyedPool2.returnObject(key, waiter); - } + keyedPool2.returnObject(key, waiter); } else { - waiter = pool2 == null ? (Waiter) pool.borrowObject() : pool2.borrowObject(); + waiter = pool2.borrowObject(); waiter.doWait(); - if (pool2 == null) { - pool.returnObject(waiter); - } else { - pool2.returnObject(waiter); - } + pool2.returnObject(waiter); } } @@ -252,12 +170,11 @@ public class PoolClientThread throws Exception { // Capture pool metrics if (randomData.nextUniform(0, 1) < samplingRate) { - if (keyed) { - numIdleStats.addValue(keyedPool2 == null ? keyedPool.getNumIdle() : keyedPool2.getNumIdle()); - numActiveStats.addValue(keyedPool2 == null ? keyedPool.getNumActive() : keyedPool2.getNumActive()); - } else { - numIdleStats.addValue(pool2 == null ? pool.getNumIdle() : pool2.getNumIdle()); - numActiveStats.addValue(pool2 == null ? pool.getNumActive() : pool2.getNumActive()); + if (keyedPool2 != null) { + numActiveStats.addValue(keyedPool2.getNumActive()); + } + if (pool2 != null) { + numActiveStats.addValue(pool2.getNumActive()); } } if (waiter != null) { @@ -270,8 +187,12 @@ public class PoolClientThread protected void finish() throws Exception { // Add metrics to stats - stats.addStatistics(numIdleStats, Thread.currentThread().getName(), "numIdle"); - stats.addStatistics(numActiveStats, Thread.currentThread().getName(), "numActive"); - stats.addStatistics(instanceIdleTimeStats, Thread.currentThread().getName(), "instance idle time"); + stats.addStatistics(numIdleStats, Thread.currentThread().getName(), + "numIdle"); + stats.addStatistics(numActiveStats, Thread.currentThread().getName(), + "numActive"); + stats.addStatistics(instanceIdleTimeStats, + Thread.currentThread().getName(), + "instance idle time"); } } Modified: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java (original) +++ commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java Sun Apr 11 22:39:56 2021 @@ -1,82 +1,97 @@ /* * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You 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.performance.pool; import java.util.logging.Logger; -import org.apache.commons.dbcp.AbandonedConfig; -import org.apache.commons.dbcp.AbandonedObjectPool; import org.apache.commons.performance.ClientThread; import org.apache.commons.performance.ConfigurationException; import org.apache.commons.performance.LoadGenerator; import org.apache.commons.performance.Statistics; -import org.apache.commons.pool.impl.SoftReferenceObjectPool; -import org.apache.commons.pool.impl.StackKeyedObjectPool; -import org.apache.commons.pool.impl.StackObjectPool; +import org.apache.commons.pool2.impl.AbandonedConfig; +import org.apache.commons.pool2.impl.GenericKeyedObjectPool; import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig; +import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; /** - * Configurable load / performance tester for commons pool. Uses Commons Digester to parse and load - * configuration and spawns PoolClientThread instances to generate load and gather statistics. - * + * Configurable load / performance tester for commons pool. Uses Commons + * Digester to parse and load configuration and spawns PoolClientThread + * instances to generate load and gather statistics. */ public class PoolSoak - extends LoadGenerator { + extends + LoadGenerator { // Pool instances - private org.apache.commons.pool.impl.GenericObjectPool genericObjectPool; - private org.apache.commons.pool.impl.GenericKeyedObjectPool genericKeyedObjectPool; - private org.apache.commons.pool2.impl.GenericObjectPool<Waiter> genericObjectPool2; - private org.apache.commons.pool2.impl.GenericKeyedObjectPool<Integer, Waiter> genericKeyedObjectPool2; - private StackObjectPool stackObjectPool; - private SoftReferenceObjectPool softReferenceObjectPool; - private StackKeyedObjectPool stackKeyedObjectPool; + + private GenericObjectPool<Waiter> genericObjectPool2; + + private GenericKeyedObjectPool<Integer, Waiter> genericKeyedObjectPool2; // Pool properties private String poolType; + private int maxActive; // maxActive for GOP, maxTotal for GKOP + private int maxActivePerKey; // maxActive for GKOP + private int maxIdle; + private int minIdle; + private long maxWait; + private byte exhaustedAction; + private boolean testOnBorrow; + private boolean testOnReturn; + private long timeBetweenEvictions; + private int testsPerEviction; + private long idleTimeout; + private boolean testWhileIdle; + private AbandonedConfig abandonedConfig = new AbandonedConfig(); + private boolean lifo; + private double samplingRate; // WaiterFactory properties private long activateLatency; + private long destroyLatency; + private long makeLatency; + private long passivateLatency; + private long validateLatency; + private long waiterLatency; + private double passivateInvalidationProbability; /** - * Add pool configuration to parameters loaded by super. Also set config file name. + * Add pool configuration to parameters loaded by super. Also set config + * file name. */ @Override protected void configure() @@ -89,7 +104,9 @@ public class PoolSoak digester.addCallParam("configuration/factory/passivate-latency", 3); digester.addCallParam("configuration/factory/validate-latency", 4); digester.addCallParam("configuration/factory/waiter-latency", 5); - digester.addCallParam("configuration/factory/passivate-invalidation-probability", 6); + digester + .addCallParam("configuration/factory/passivate-invalidation-probability", + 6); digester.addCallMethod("configuration/pool", "configurePool", 15); digester.addCallParam("configuration/pool/max-active", 0); digester.addCallParam("configuration/pool/max-active-per-key", 1); @@ -106,10 +123,15 @@ public class PoolSoak digester.addCallParam("configuration/pool/lifo", 12); digester.addCallParam("configuration/pool/type", 13); digester.addCallParam("configuration/pool/sampling-rate", 14); - digester.addCallMethod("configuration/abandoned-config", "configureAbandonedConfig", 3); - digester.addCallParam("configuration/abandoned-config/log-abandoned", 0); - digester.addCallParam("configuration/abandoned-config/remove-abandoned", 1); - digester.addCallParam("configuration/abandoned-config/abandoned-timeout", 2); + digester.addCallMethod("configuration/abandoned-config", + "configureAbandonedConfig", 3); + digester.addCallParam("configuration/abandoned-config/log-abandoned", + 0); + digester.addCallParam("configuration/abandoned-config/remove-abandoned", + 1); + digester + .addCallParam("configuration/abandoned-config/abandoned-timeout", + 2); this.configFile = "config-pool.xml"; @@ -122,34 +144,21 @@ public class PoolSoak protected void init() throws Exception { // Create factory - WaiterFactory factory = new WaiterFactory(activateLatency, destroyLatency, makeLatency, passivateLatency, - validateLatency, waiterLatency, maxActive, maxActivePerKey, - passivateInvalidationProbability); - WaiterFactory2 factory2 = new WaiterFactory2(activateLatency, destroyLatency, makeLatency, passivateLatency, - validateLatency, waiterLatency, maxActive, maxActivePerKey, + WaiterFactory2 factory2 = new WaiterFactory2(activateLatency, + destroyLatency, + makeLatency, + passivateLatency, + validateLatency, + waiterLatency, maxActive, + maxActivePerKey, passivateInvalidationProbability); // Create object pool - if (poolType.equals("GenericObjectPool")) { - genericObjectPool = new org.apache.commons.pool.impl.GenericObjectPool(factory); - genericObjectPool.setMaxActive(maxActive); - genericObjectPool.setWhenExhaustedAction(exhaustedAction); - genericObjectPool.setMaxWait(maxWait); - genericObjectPool.setMaxIdle(maxIdle); - genericObjectPool.setMinIdle(minIdle); - genericObjectPool.setTestOnBorrow(testOnBorrow); - genericObjectPool.setTestOnReturn(testOnReturn); - genericObjectPool.setTimeBetweenEvictionRunsMillis(timeBetweenEvictions); - genericObjectPool.setNumTestsPerEvictionRun(testsPerEviction); - genericObjectPool.setMinEvictableIdleTimeMillis(idleTimeout); - genericObjectPool.setTestWhileIdle(testWhileIdle); - genericObjectPool.setLifo(lifo); - } else if (poolType.equals("GenericObjectPool2")) { + + if (poolType.equals("GenericObjectPool2")) { GenericObjectPoolConfig config = new GenericObjectPoolConfig(); - config - .setBlockWhenExhausted(exhaustedAction == org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK - ? true : false); + config.setBlockWhenExhausted(exhaustedAction == 1 ? true : false); config.setMaxIdle(maxIdle); config.setMinIdle(minIdle); config.setMaxWaitMillis(maxWait); @@ -161,43 +170,14 @@ public class PoolSoak config.setMinEvictableIdleTimeMillis(idleTimeout); config.setLifo(lifo); config.setMaxTotal(maxActive); - genericObjectPool2 = new org.apache.commons.pool2.impl.GenericObjectPool<Waiter>(factory2, config); - } else if (poolType.equals("AbandonedObjectPool")) { - genericObjectPool = new AbandonedObjectPool(factory, abandonedConfig); - genericObjectPool.setMaxActive(maxActive); - genericObjectPool.setWhenExhaustedAction(exhaustedAction); - genericObjectPool.setMaxWait(maxWait); - genericObjectPool.setMaxIdle(maxIdle); - genericObjectPool.setMinIdle(minIdle); - genericObjectPool.setTestOnBorrow(testOnBorrow); - genericObjectPool.setTestOnReturn(testOnReturn); - genericObjectPool.setTimeBetweenEvictionRunsMillis(timeBetweenEvictions); - genericObjectPool.setNumTestsPerEvictionRun(testsPerEviction); - genericObjectPool.setMinEvictableIdleTimeMillis(idleTimeout); - genericObjectPool.setTestWhileIdle(testWhileIdle); - genericObjectPool.setLifo(lifo); - } else if (poolType.equals("GenericKeyedObjectPool")) { - genericKeyedObjectPool = new org.apache.commons.pool.impl.GenericKeyedObjectPool(factory); - genericKeyedObjectPool.setMaxActive(maxActivePerKey); - genericKeyedObjectPool.setMaxTotal(maxActive); - genericKeyedObjectPool.setWhenExhaustedAction(exhaustedAction); - genericKeyedObjectPool.setMaxWait(maxWait); - genericKeyedObjectPool.setMaxIdle(maxIdle); - genericKeyedObjectPool.setMinIdle(minIdle); - genericKeyedObjectPool.setTestOnBorrow(testOnBorrow); - genericKeyedObjectPool.setTestOnReturn(testOnReturn); - genericKeyedObjectPool.setTimeBetweenEvictionRunsMillis(timeBetweenEvictions); - genericKeyedObjectPool.setNumTestsPerEvictionRun(testsPerEviction); - genericKeyedObjectPool.setMinEvictableIdleTimeMillis(idleTimeout); - genericKeyedObjectPool.setTestWhileIdle(testWhileIdle); - genericKeyedObjectPool.setLifo(lifo); + genericObjectPool2 = new GenericObjectPool<Waiter>(factory2, + config); + } else if (poolType.equals("GenericKeyedObjectPool2")) { GenericKeyedObjectPoolConfig config = new GenericKeyedObjectPoolConfig(); config.setMaxTotal(maxActive); config.setMaxTotalPerKey(maxActivePerKey); - config - .setBlockWhenExhausted(exhaustedAction == org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK - ? true : false); + config.setBlockWhenExhausted(exhaustedAction == 1 ? true : false); config.setMaxWaitMillis(maxWait); config.setMaxIdlePerKey(maxIdle); config.setMinIdlePerKey(minIdle); @@ -208,17 +188,11 @@ public class PoolSoak config.setMinEvictableIdleTimeMillis(idleTimeout); config.setTestWhileIdle(testWhileIdle); config.setLifo(lifo); - genericKeyedObjectPool2 = new org.apache.commons.pool2.impl.GenericKeyedObjectPool<Integer, Waiter>( - factory2, - config); - } else if (poolType.equals("StackObjectPool")) { - stackObjectPool = new StackObjectPool(factory); - } else if (poolType.equals("SoftReferenceObjectPool")) { - softReferenceObjectPool = new SoftReferenceObjectPool(factory); - } else if (poolType.equals("StackKeyedObjectPool")) { - stackKeyedObjectPool = new StackKeyedObjectPool(factory); + genericKeyedObjectPool2 = new GenericKeyedObjectPool<Integer, Waiter>(factory2, + config); } else { - throw new ConfigurationException("invalid pool type configuration: " + poolType); + throw new ConfigurationException("invalid pool type configuration: " + + poolType); } logger.info(displayConfig()); @@ -230,70 +204,41 @@ public class PoolSoak @Override protected void cleanUp() throws Exception { - if (genericObjectPool != null) { - genericObjectPool.close(); - } - if (genericKeyedObjectPool != null) { - genericKeyedObjectPool.close(); - } + if (genericObjectPool2 != null) { genericObjectPool2.close(); } if (genericKeyedObjectPool2 != null) { genericKeyedObjectPool2.close(); } - if (stackObjectPool != null) { - stackObjectPool.close(); - } - if (softReferenceObjectPool != null) { - softReferenceObjectPool.close(); - } - if (stackKeyedObjectPool != null) { - stackKeyedObjectPool.close(); - } + } /** * Create and return a PoolClientThread */ @Override - protected ClientThread makeClientThread(long iterations, long minDelay, long maxDelay, double sigma, - String delayType, long rampPeriod, long peakPeriod, long troughPeriod, String cycleType, String rampType, - Logger logger, Statistics stats) { - if (poolType.equals("GenericObjectPool")) { - return new PoolClientThread(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, - troughPeriod, cycleType, rampType, logger, stats, genericObjectPool, - samplingRate); - } - if (poolType.equals("GenericKeyedObjectPool")) { - return new PoolClientThread(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, - troughPeriod, cycleType, rampType, logger, stats, genericKeyedObjectPool, - samplingRate); - } + protected ClientThread + makeClientThread(long iterations, long minDelay, long maxDelay, + double sigma, String delayType, long rampPeriod, + long peakPeriod, long troughPeriod, String cycleType, + String rampType, Logger logger, Statistics stats) { + if (poolType.equals("GenericObjectPool2")) { - return new PoolClientThread(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, - troughPeriod, cycleType, rampType, logger, stats, genericObjectPool2, + return new PoolClientThread(iterations, minDelay, maxDelay, sigma, + delayType, rampPeriod, peakPeriod, + troughPeriod, cycleType, rampType, + logger, stats, genericObjectPool2, samplingRate); } if (poolType.equals("GenericKeyedObjectPool2")) { - return new PoolClientThread(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, - troughPeriod, cycleType, rampType, logger, stats, genericKeyedObjectPool2, - samplingRate); - } - if (poolType.equals("StackKeyedObjectPool")) { - return new PoolClientThread(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, - troughPeriod, cycleType, rampType, logger, stats, stackKeyedObjectPool, - samplingRate); - } - if (poolType.equals("StackObjectPool")) { - return new PoolClientThread(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, - troughPeriod, cycleType, rampType, logger, stats, stackObjectPool, samplingRate); - } - if (poolType.equals("SoftReferenceObjectPool")) { - return new PoolClientThread(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, - troughPeriod, cycleType, rampType, logger, stats, softReferenceObjectPool, + return new PoolClientThread(iterations, minDelay, maxDelay, sigma, + delayType, rampPeriod, peakPeriod, + troughPeriod, cycleType, rampType, + logger, stats, genericKeyedObjectPool2, samplingRate); } + return null; } @@ -301,8 +246,10 @@ public class PoolSoak // Configuration methods specific to this LoadGenerator invoked by Digester // when superclass execute calls digester.parse. // ------------------------------------------------------------------------ - public void configureFactory(String activateLatency, String destroyLatency, String makeLatency, - String passivateLatency, String validateLatency, String waiterLatency, String passivateInvalidationProbability) { + public void configureFactory(String activateLatency, String destroyLatency, + String makeLatency, String passivateLatency, + String validateLatency, String waiterLatency, + String passivateInvalidationProbability) { this.activateLatency = Long.parseLong(activateLatency); this.destroyLatency = Long.parseLong(destroyLatency); @@ -310,12 +257,17 @@ public class PoolSoak this.passivateLatency = Long.parseLong(passivateLatency); this.validateLatency = Long.parseLong(validateLatency); this.waiterLatency = Long.parseLong(waiterLatency); - this.passivateInvalidationProbability = Double.parseDouble(passivateInvalidationProbability); + this.passivateInvalidationProbability = Double + .parseDouble(passivateInvalidationProbability); } - public void configurePool(String maxActive, String maxActivePerKey, String maxIdle, String minIdle, String maxWait, - String exhaustedAction, String testOnBorrow, String testOnReturn, String timeBetweenEvictions, - String testsPerEviction, String idleTimeout, String testWhileIdle, String lifo, String type, String samplingRate) + public void configurePool(String maxActive, String maxActivePerKey, + String maxIdle, String minIdle, String maxWait, + String exhaustedAction, String testOnBorrow, + String testOnReturn, String timeBetweenEvictions, + String testsPerEviction, String idleTimeout, + String testWhileIdle, String lifo, String type, + String samplingRate) throws ConfigurationException { this.maxActive = Integer.parseInt(maxActive); this.maxActivePerKey = Integer.parseInt(maxActivePerKey); @@ -331,30 +283,24 @@ public class PoolSoak this.lifo = Boolean.parseBoolean(lifo); this.poolType = type; if (exhaustedAction.equals("block")) { - this.exhaustedAction = org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK; + this.exhaustedAction = 1; } else if (exhaustedAction.equals("fail")) { - this.exhaustedAction = org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_FAIL; - } else if (exhaustedAction.equals("grow")) { - this.exhaustedAction = org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_GROW; + this.exhaustedAction = 0; } else { - throw new ConfigurationException("Bad configuration setting for exhausted action: " + exhaustedAction); + throw new ConfigurationException("Bad configuration setting for exhausted action: " + + exhaustedAction); } this.samplingRate = Double.parseDouble(samplingRate); } - public void configureAbandonedConfig(String logAbandoned, String removeAbandoned, String abandonedTimeout) { + public void configureAbandonedConfig(String logAbandoned, + String removeAbandoned, + String abandonedTimeout) { abandonedConfig.setLogAbandoned(Boolean.parseBoolean(logAbandoned)); - abandonedConfig.setRemoveAbandoned(Boolean.parseBoolean(removeAbandoned)); - abandonedConfig.setRemoveAbandonedTimeout(Integer.parseInt(abandonedTimeout)); - } - - // Pool getters for unit tests - protected org.apache.commons.pool.impl.GenericObjectPool getGenericObjectPool() { - return genericObjectPool; - } - - protected org.apache.commons.pool.impl.GenericKeyedObjectPool getGenericKeyedObjectPool() { - return genericKeyedObjectPool; + abandonedConfig + .setRemoveAbandonedOnBorrow(Boolean.parseBoolean(removeAbandoned)); + abandonedConfig + .setRemoveAbandonedTimeout(Integer.parseInt(abandonedTimeout)); } public String displayConfig() { @@ -402,7 +348,7 @@ public class PoolSoak buffer.append(abandonedConfig.getLogAbandoned()); buffer.append("\n"); buffer.append(" removeAbandoned: "); - buffer.append(abandonedConfig.getRemoveAbandoned()); + buffer.append(abandonedConfig.getRemoveAbandonedOnBorrow()); buffer.append("\n"); buffer.append(" abandonedTimeout: "); buffer.append(abandonedConfig.getRemoveAbandonedTimeout()); @@ -411,4 +357,8 @@ public class PoolSoak return buffer.toString(); } + protected GenericObjectPool getGenericObjectPool() { + return genericObjectPool2; + } + } Modified: commons/sandbox/performance/trunk/src/pool/build.properties.sample URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/pool/build.properties.sample?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/pool/build.properties.sample (original) +++ commons/sandbox/performance/trunk/src/pool/build.properties.sample Sun Apr 11 22:39:56 2021 @@ -17,10 +17,8 @@ ############################################################################### # Remote maven repository -mavenRepo=http://repo1.maven.org/maven2 +mavenRepo=https://repo1.maven.org/maven2 # Replace with full path to versions of pool, dbcp jars you want to test with -pool-jar=${user.home}/.m2/repository/commons-pool/commons-pool/1.5.6/commons-pool-1.5.6.jar pool2-jar=${user.home}/.m2/repository/org/apache/commons/commons-pool2/2.2/commons-pool2-2.2.jar -dbcp-jar=${user.home}/.m2/repository/commons-dbcp/commons-dbcp/1.3/commons-dbcp-1.3.jar Modified: commons/sandbox/performance/trunk/src/pool/build.xml URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/pool/build.xml?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/pool/build.xml (original) +++ commons/sandbox/performance/trunk/src/pool/build.xml Sun Apr 11 22:39:56 2021 @@ -29,9 +29,7 @@ <property file="${component-propfile}"/> <path id="compile.classpath"> - <pathelement location="${pool-jar}"/> <pathelement location="${pool2-jar}"/> - <pathelement location="${dbcp-jar}"/> <fileset dir="${lib}"> <include name="*.jar"/> </fileset> Modified: commons/sandbox/performance/trunk/src/site/apt/index.apt URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/site/apt/index.apt?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/site/apt/index.apt (original) +++ commons/sandbox/performance/trunk/src/site/apt/index.apt Sun Apr 11 22:39:56 2021 @@ -59,7 +59,7 @@ Overview [[1]] Edit the configuration in src/dbcp/config-dbcp.xml - [[2]] Make sure the configured database is running and accepting connections + [[2]] If you have configured a real database, make sure it is running and accepting connections [[3]] Specify the path to the jdbc driver jar and the dbcp and pool jars you want to test with in src/dbcp/build.properties Modified: commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/PoolSoakTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/PoolSoakTest.java?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/PoolSoakTest.java (original) +++ commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/PoolSoakTest.java Sun Apr 11 22:39:56 2021 @@ -1,136 +1,91 @@ /* * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You 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.performance.pool; -import java.io.InputStream; import java.io.IOException; -import org.apache.commons.dbcp.AbandonedObjectPool; -import org.apache.commons.pool.impl.GenericObjectPool; +import java.io.InputStream; + +import org.apache.commons.pool2.impl.GenericObjectPool; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; -public class PoolSoakTest extends TestCase { - +public class PoolSoakTest + extends + TestCase { + + public PoolSoakTest(String name) { + super(name); + } + + public static Test suite() { + return new TestSuite(PoolSoakTest.class); + } + + protected PoolSoak poolSoak = null; + + public void setUp() + throws Exception { + poolSoak = new PoolSoak(); + poolSoak.configure(); + } + + public void testGenericObjectPoolConfig() + throws Exception { + /** + * Contents of config file <max-active>15</max-active> + * <max-idle>15</max-idle> <min-idle>0</min-idle> + * <max-wait>-1</max-wait> <!-- block, fail, or grow --> + * <exhausted-action>block</exhausted-action> + * <test-on-borrow>false</test-on-borrow> + * <test-on-return>false</test-on-return> + * <time-between-evictions>-1</time-between-evictions> + * <tests-per-eviction>3</tests-per-eviction> + * <idle-timeout>-1</idle-timeout> + * <test-while-idle>false</test-while-idle> + **/ + poolSoak.getDigester().parse(getInputStream("config-pool.xml")); + poolSoak.init(); + GenericObjectPool pool = poolSoak.getGenericObjectPool(); + assertEquals(15, pool.getMaxTotal()); + assertEquals(15, pool.getMaxIdle()); + assertEquals(10, pool.getMinIdle()); + assertEquals(-1, pool.getMaxWaitMillis()); + assertEquals(true, pool.getBlockWhenExhausted()); + assertEquals(false, pool.getTestOnBorrow()); + assertEquals(false, pool.getTestOnReturn()); + assertEquals(-1, pool.getTimeBetweenEvictionRunsMillis()); + assertEquals(3, pool.getNumTestsPerEvictionRun()); + assertEquals(-1, pool.getMinEvictableIdleTimeMillis()); + assertEquals(false, pool.getTestWhileIdle()); + } + + /** + * Return an appropriate InputStream for the specified test file (which must + * be inside our current package). Borrowed from Commons Digester + * RuleTestCase. + * + * @param name Name of the test file we want + * @exception IOException if an input/output error occurs + */ + protected InputStream getInputStream(String name) + throws IOException { + + return (this.getClass() + .getResourceAsStream("/org/apache/commons/performance/pool/" + + name)); + } - public PoolSoakTest(String name) { - super(name); - } - - - public static Test suite() { - return new TestSuite(PoolSoakTest.class); - } - - protected PoolSoak poolSoak = null; - - public void setUp() throws Exception { - poolSoak = new PoolSoak(); - poolSoak.configure(); - } - - public void testGenericObjectPoolConfig() throws Exception { - /** Contents of config file - <max-active>15</max-active> - <max-idle>15</max-idle> - <min-idle>0</min-idle> - <max-wait>-1</max-wait> - <!-- block, fail, or grow --> - <exhausted-action>block</exhausted-action> - <test-on-borrow>false</test-on-borrow> - <test-on-return>false</test-on-return> - <time-between-evictions>-1</time-between-evictions> - <tests-per-eviction>3</tests-per-eviction> - <idle-timeout>-1</idle-timeout> - <test-while-idle>false</test-while-idle> - **/ - poolSoak.getDigester().parse(getInputStream("config-pool.xml")); - poolSoak.init(); - GenericObjectPool pool = poolSoak.getGenericObjectPool(); - assertEquals(15, pool.getMaxActive()); - assertEquals(15, pool.getMaxIdle()); - assertEquals(10, pool.getMinIdle()); - assertEquals(-1, pool.getMaxWait()); - assertEquals(GenericObjectPool.WHEN_EXHAUSTED_BLOCK, - pool.getWhenExhaustedAction()); - assertEquals(false, pool.getTestOnBorrow()); - assertEquals(false, pool.getTestOnReturn()); - assertEquals(-1, pool.getTimeBetweenEvictionRunsMillis()); - assertEquals(3, pool.getNumTestsPerEvictionRun()); - assertEquals(-1, pool.getMinEvictableIdleTimeMillis()); - assertEquals(false, pool.getTestWhileIdle()); - } - - public void testAbandonedObjectPoolConfig() throws Exception { - /* - <pool> - <!-- GenericObjectPool or AbandonedObjectPool --> - <type>AbandonedObjectPool</type> - <max-active>15</max-active> - <max-idle>-1</max-idle> - <min-idle>0</min-idle> - <max-wait>-1</max-wait> - <!-- block, fail, or grow --> - <exhausted-action>grow</exhausted-action> - <test-on-borrow>true</test-on-borrow> - <test-on-return>false</test-on-return> - <time-between-evictions>-1</time-between-evictions> - <tests-per-eviction>3</tests-per-eviction> - <idle-timeout>-1</idle-timeout> - <test-while-idle>true</test-while-idle> - </pool> - - <!-- Ignored unless pool type is AbandonedObjectPool --> - <abandoned-config> - <log-abandoned>true</log-abandoned> - <remove-abandoned>false</remove-abandoned> - <abandoned-timeout>50000</abandoned-timeout> - </abandoned-config> - */ - poolSoak.getDigester().parse(getInputStream("config-abandoned.xml")); - poolSoak.init(); - AbandonedObjectPool pool = (AbandonedObjectPool) poolSoak.getGenericObjectPool(); - assertEquals(15, pool.getMaxActive()); - assertEquals(-1, pool.getMaxIdle()); - assertEquals(0, pool.getMinIdle()); - assertEquals(-1, pool.getMaxWait()); - assertEquals(GenericObjectPool.WHEN_EXHAUSTED_GROW, - pool.getWhenExhaustedAction()); - assertEquals(true, pool.getTestOnBorrow()); - assertEquals(false, pool.getTestOnReturn()); - assertEquals(-1, pool.getTimeBetweenEvictionRunsMillis()); - assertEquals(3, pool.getNumTestsPerEvictionRun()); - assertEquals(-1, pool.getMinEvictableIdleTimeMillis()); - assertEquals(true, pool.getTestWhileIdle()); - } - - /** - * Return an appropriate InputStream for the specified test file (which - * must be inside our current package). - * - * Borrowed from Commons Digester RuleTestCase. - * - * @param name Name of the test file we want - * @exception IOException if an input/output error occurs - */ - protected InputStream getInputStream(String name) throws IOException { - - return (this.getClass().getResourceAsStream - ("/org/apache/commons/performance/pool/" + name)); - } - } Modified: commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/WaiterTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/WaiterTest.java?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/WaiterTest.java (original) +++ commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/WaiterTest.java Sun Apr 11 22:39:56 2021 @@ -1,82 +1,86 @@ /* * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You 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.performance.pool; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -public class WaiterTest extends TestCase { - - - public WaiterTest(String name) { - super(name); - } - - - public static Test suite() { - return new TestSuite(WaiterTest.class); - } - - protected WaiterFactory factory = null; - - /* - public WaiterFactory(long activateLatency, long destroyLatency, - long makeLatency, long passivateLatency, long validateLatency, - long waiterLatency,long maxActive) - */ - public void setUp() throws Exception { - factory = new WaiterFactory(0, 0, 0, 0, 0, 0, 5); // All latencies 0, maxActive = 5; - } - - public void testMaxActiveExceeded() throws Exception { - try { - for (int i = 0; i < 6; i++) { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import org.apache.commons.pool2.PooledObject; +import org.junit.Before; +import org.junit.Test; + +public class WaiterTest { + + public WaiterTest() { + + } + + protected WaiterFactory2 factory = null; + + /* + * public WaiterFactory(long activateLatency, long destroyLatency, long + * makeLatency, long passivateLatency, long validateLatency, long + * waiterLatency,long maxActive) + */ + @Before + public void setUp() + throws Exception { + factory = new WaiterFactory2(0, 0, 0, 0, 0, 0, 5); // All latencies 0, + // maxActive = 5; + } + + @Test + public void testMaxActiveExceeded() + throws Exception { + try { + for (int i = 0; i < 6; i++) { + factory.makeObject(); + } + fail("Expecting IllegalStateException"); + } catch (IllegalStateException ex) { + // Expected + } + } + + @Test + public void testMaxActive() + throws Exception { + for (int i = 0; i < 5; i++) { factory.makeObject(); - } - fail("Expecting IllegalStateException"); - } catch (IllegalStateException ex) { - // Expected - } - } - - public void testMaxActive() throws Exception { - for (int i = 0; i < 5; i++) { - factory.makeObject(); - } - } - - public void testgetLastIdleTime() throws Exception { - Waiter waiter = (Waiter) factory.makeObject(); - factory.passivateObject(waiter); // Start last idle time clock - Thread.sleep(200); - factory.passivateObject(waiter); // Should make no difference - Thread.sleep(200); - factory.activateObject(waiter); // last idle time updated - assertEquals(400, waiter.getLastIdleTimeMs(), 50); - Thread.sleep(200); - factory.activateObject(waiter); // Should make no difference - Thread.sleep(200); - factory.passivateObject(waiter); - Thread.sleep(400); - factory.activateObject(waiter); // Last idle time updated - assertEquals(400, waiter.getLastIdleTimeMs(), 50); - factory.passivateObject(waiter); // clock started - assertEquals(400, waiter.getLastIdleTimeMs(), 50); // but no lastIdleTime update until reactivated - } - + } + } + + @Test + public void testgetLastIdleTime() + throws Exception { + PooledObject<Waiter> waiter = factory.makeObject(); + factory.passivateObject(waiter); // Start last idle time clock + Thread.sleep(200); + factory.passivateObject(waiter); // Should make no difference + Thread.sleep(200); + factory.activateObject(waiter); // last idle time updated + assertEquals(400, waiter.getObject().getLastIdleTimeMs(), 50); + Thread.sleep(200); + factory.activateObject(waiter); // Should make no difference + Thread.sleep(200); + factory.passivateObject(waiter); + Thread.sleep(400); + factory.activateObject(waiter); // Last idle time updated + assertEquals(400, waiter.getObject().getLastIdleTimeMs(), 50); + factory.passivateObject(waiter); // clock started + // but no lastIdleTime update until reactivated + assertEquals(400, waiter.getObject().getLastIdleTimeMs(), 50); + } + } Modified: commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/config-pool.xml URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/config-pool.xml?rev=1888642&r1=1888641&r2=1888642&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/config-pool.xml (original) +++ commons/sandbox/performance/trunk/src/test/org/apache/commons/performance/pool/config-pool.xml Sun Apr 11 22:39:56 2021 @@ -33,7 +33,7 @@ <pool> <!-- GenericObjectPool or AbandonedObjectPool --> - <type>GenericObjectPool</type> + <type>GenericObjectPool2</type> <max-active>15</max-active> <max-idle>15</max-idle> <min-idle>10</min-idle>