Author: psteitz Date: Thu Mar 27 20:19:31 2014 New Revision: 1582457 URL: http://svn.apache.org/r1582457 Log: Added active, idle stats tracking to dbcp threads.
Modified: commons/sandbox/performance/trunk/src/dbcp/config-dbcp.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 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=1582457&r1=1582456&r2=1582457&view=diff ============================================================================== --- commons/sandbox/performance/trunk/src/dbcp/config-dbcp.xml (original) +++ commons/sandbox/performance/trunk/src/dbcp/config-dbcp.xml Thu Mar 27 20:19:31 2014 @@ -63,6 +63,7 @@ <tests-per-eviction>3</tests-per-eviction> <idle-timeout>-1</idle-timeout> <test-while-idle>false</test-while-idle> + <sampling-rate>0.1</sampling-rate> </pool> <!-- Ignored unless pool type is AbandonedObjectPool --> 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=1582457&r1=1582456&r2=1582457&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 Thu Mar 27 20:19:31 2014 @@ -21,31 +21,50 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.logging.Logger; + import javax.sql.DataSource; +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; /** - * Client thread that executes requests in a loop using a configured - * DataSource, with the number of requests, time between requests and - * query strings governed by constructor parameters. See - * {@link ClientThread ClientThread javadoc} for a description - * of how times between requests are computed. - * + * Client thread that executes requests in a loop using a configured DataSource, with the number of + * requests, time between requests and query strings governed by constructor parameters. See + * {@link ClientThread ClientThread javadoc} for a description of how times between requests are + * computed. + * */ -public class DBCPClientThread extends ClientThread { +public class DBCPClientThread + extends ClientThread { + /** Initial segment of query string */ private String queryString = null; /** Whether or not the query is on the text column */ private boolean textQuery = false; /** DataSource used to connect */ private DataSource dataSource = null; + /** Type of DataSource */ + private DataSourceType type; /** Database connection */ Connection conn = null; /** Current query */ String currentQuery = null; - + + /** Statistics on numActive */ + private SummaryStatistics numActiveStats = new SummaryStatistics(); + /** Statistics on numIdle */ + private SummaryStatistics numIdleStats = new SummaryStatistics(); + /** Sampling rate for numActive, numIdle */ + private double samplingRate; + private final RandomDataGenerator random = new RandomDataGenerator(); + + // Cast targets to query for stats + org.apache.commons.dbcp.BasicDataSource dbcp1DS = null; + org.apache.commons.dbcp2.BasicDataSource dbcp2DS = null; + org.apache.tomcat.jdbc.pool.DataSource tomcatDS = null; + /** * Create a dbcp client thread. * @@ -54,7 +73,7 @@ public class DBCPClientThread extends Cl * @param maxDelay maximum delay time between client requests * @param sigma standard deviation of delay times between client requests * @param delayType distribution of time between client requests - * @param queryType type of query + * @param queryType type of query * @param rampPeriod rampup, rampdown period for cyclic load * @param peakPeriod period of sustained peak for cyclic load * @param troughPeriod period of sustained minimum load @@ -64,48 +83,60 @@ public class DBCPClientThread extends Cl * @param dataSource DataSource for connections * @param stats Statistics container */ - public DBCPClientThread(long iterations, long minDelay, long maxDelay, - double sigma, String delayType, String queryType, long rampPeriod, - long peakPeriod, long troughPeriod, String cycleType, - String rampType, Logger logger, DataSource dataSource, - Statistics stats) { - - super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, - peakPeriod, troughPeriod, cycleType, rampType, logger, - stats); - + public DBCPClientThread(long iterations, long minDelay, long maxDelay, double sigma, String delayType, + String queryType, long rampPeriod, long peakPeriod, long troughPeriod, String cycleType, + String rampType, Logger logger, DataSource dataSource, Statistics stats, double samplingRate) { + + super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod, peakPeriod, troughPeriod, cycleType, + rampType, logger, stats); + 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) { + type = DataSourceType.DBCP2; + dbcp2DS = (org.apache.commons.dbcp2.BasicDataSource) dataSource; + } else { + type = DataSourceType.TOMCAT; + tomcatDS = (org.apache.tomcat.jdbc.pool.DataSource) dataSource; + } + if (queryType.equals("no-op")) { return; } - + if (queryType.equals("integerIndexed")) { queryString = "select * from test_table WHERE indexed="; } else if (queryType.equals("integerScan")) { - queryString = "select * from test_table WHERE not_indexed="; + queryString = "select * from test_table WHERE not_indexed="; } else { - queryString = "select * from test_table WHERE text='"; + queryString = "select * from test_table WHERE text='"; textQuery = true; } + + this.samplingRate = samplingRate; } - + /** Generate a random query */ - public void setUp() throws Exception { + @Override + public void setUp() + throws Exception { if (queryString == null) { return; } if (textQuery) { - currentQuery = queryString + - randomData.nextHexString(20) + "';"; + currentQuery = queryString + randomData.nextHexString(20) + "';"; } else { - currentQuery = queryString + - randomData.nextInt(0, 100) + ";"; + currentQuery = queryString + randomData.nextInt(0, 100) + ";"; } } - + /** Execute query */ - public void execute() throws Exception { + @Override + public void execute() + throws Exception { conn = dataSource.getConnection(); if (queryString == null) { return; @@ -119,16 +150,53 @@ public class DBCPClientThread extends Cl rs.close(); stmt.close(); } - - /** Close connection */ - public void cleanUp() throws Exception { + + /** Close connection, capture idle / active stats */ + @Override + public void cleanUp() + throws Exception { if (conn != null) { try { conn.close(); } finally { conn = null; - } + } } + // Capture pool metrics + if (randomData.nextUniform(0, 1) < samplingRate) { + int numIdle; + int numActive; + switch (type) { + case DBCP1: + numActive = dbcp1DS.getNumActive(); + numIdle = dbcp1DS.getNumIdle(); + break; + case DBCP2: + numActive = dbcp2DS.getNumActive(); + numIdle = dbcp2DS.getNumIdle(); + break; + case TOMCAT: + numActive = tomcatDS.getNumActive(); + numIdle = tomcatDS.getNumIdle(); + break; + default: + throw new RuntimeException("Invalid datasource type"); + } + numIdleStats.addValue(numIdle); + numActiveStats.addValue(numActive); + } + } + + @Override + protected void finish() + throws Exception { + // Add metrics to stats + stats.addStatistics(numIdleStats, Thread.currentThread().getName(), "numIdle"); + stats.addStatistics(numActiveStats, Thread.currentThread().getName(), "numActive"); + } + + private enum DataSourceType { + DBCP1, 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=1582457&r1=1582456&r2=1582457&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 Thu Mar 27 20:19:31 2014 @@ -80,6 +80,7 @@ public class DBCPSoak private int maxIdle; private int minIdle; private long maxWait; + private double samplingRate; // DataSource type private String dataSourceType; @@ -270,11 +271,12 @@ public class DBCPSoak @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) { + String delayType, long rampPeriod, long peakPeriod, long troughPeriod, String cycleType, String rampType, + Logger logger, Statistics stats) { return new DBCPClientThread(iterations, minDelay, maxDelay, sigma, delayType, queryType, rampPeriod, - peakPeriod, troughPeriod, cycleType, rampType, logger, dataSource, stats); + peakPeriod, troughPeriod, cycleType, rampType, logger, dataSource, stats, + samplingRate); } // ------------------------------------------------------------------------ @@ -307,8 +309,8 @@ public class DBCPSoak } public void configurePool(String maxActive, String maxIdle, String minIdle, String maxWait, String exhaustedAction, - String testOnBorrow, String testOnReturn, String timeBetweenEvictions, - String testsPerEviction, String idleTimeout, String testWhileIdle, String type) + String testOnBorrow, String testOnReturn, String timeBetweenEvictions, String testsPerEviction, + String idleTimeout, String testWhileIdle, String type, String samplingRate) throws ConfigurationException { this.maxActive = Integer.parseInt(maxActive); this.maxIdle = Integer.parseInt(maxIdle); @@ -330,6 +332,7 @@ public class DBCPSoak } else { throw new ConfigurationException("Bad configuration setting for exhausted action: " + exhaustedAction); } + this.samplingRate = Double.parseDouble(samplingRate); } public void configureAbandonedConfig(String logAbandoned, String removeAbandoned, String abandonedTimeout) { @@ -365,7 +368,7 @@ public class DBCPSoak int not_indexed = randomData.nextInt(0, 1000); String text = randomData.nextHexString(20); sqlText = "INSERT INTO test_table (indexed, text, not_indexed)" + "VALUES (" + indexed + "," + "'" + - text + "'," + not_indexed + ");"; + text + "'," + not_indexed + ");"; sql.executeUpdate(sqlText); } sql.close(); @@ -404,7 +407,7 @@ public class DBCPSoak digester.addCallParam("configuration/poolable-connection-factory/pool-prepared-statements", 1); digester.addCallParam("configuration/poolable-connection-factory/max-open-statements", 2); - digester.addCallMethod("configuration/pool", "configurePool", 12); + digester.addCallMethod("configuration/pool", "configurePool", 13); digester.addCallParam("configuration/pool/max-active", 0); digester.addCallParam("configuration/pool/max-idle", 1); digester.addCallParam("configuration/pool/min-idle", 2); @@ -417,6 +420,7 @@ public class DBCPSoak digester.addCallParam("configuration/pool/idle-timeout", 9); digester.addCallParam("configuration/pool/test-while-idle", 10); digester.addCallParam("configuration/pool/type", 11); + digester.addCallParam("configuration/pool/sampling-rate", 12); digester.addCallMethod("configuration/abandoned-config", "configureAbandonedConfig", 3); digester.addCallParam("configuration/abandoned-config/log-abandoned", 0);