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);