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


Reply via email to