Author: fhanik
Date: Sun May  3 00:18:33 2009
New Revision: 771006

URL: http://svn.apache.org/viewvc?rev=771006&view=rev
Log:
Make connection objects non reusable. Once release has been called, it can't be 
reused.
This makes the sizing algorithm easier
C3P0 leaks connections during the fairness test, reaches 20 connections even 
max is set to 10


Modified:
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
    
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/DefaultTestCase.java
    
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java

Modified: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=771006&r1=771005&r2=771006&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 Sun May  3 00:18:33 2009
@@ -60,39 +60,39 @@
     /**
      * All the information about the connection pool
      */
-    protected PoolProperties poolProperties;
+    private PoolProperties poolProperties;
 
     /**
      * Contains all the connections that are in use
      * TODO - this shouldn't be a blocking queue, simply a list to hold our 
objects
      */
-    protected BlockingQueue<PooledConnection> busy;
+    private BlockingQueue<PooledConnection> busy;
 
     /**
      * Contains all the idle connections
      */
-    protected BlockingQueue<PooledConnection> idle;
+    private BlockingQueue<PooledConnection> idle;
 
     /**
      * The thread that is responsible for checking abandoned and idle threads
      */
-    protected PoolCleaner poolCleaner;
+    private PoolCleaner poolCleaner;
 
     /**
      * Pool closed flag
      */
-    protected boolean closed = false;
+    private boolean closed = false;
 
     /**
      * Since newProxyInstance performs the same operation, over and over
      * again, it is much more optimized if we simply store the constructor 
ourselves.
      */
-    protected Constructor proxyClassConstructor;
+    private Constructor proxyClassConstructor;
 
     /**
      * Executor service used to cancel Futures
      */
-    protected ThreadPoolExecutor cancellator = new 
ThreadPoolExecutor(0,1,1000,TimeUnit.MILLISECONDS,new 
LinkedBlockingQueue<Runnable>());
+    private ThreadPoolExecutor cancellator = new 
ThreadPoolExecutor(0,1,1000,TimeUnit.MILLISECONDS,new 
LinkedBlockingQueue<Runnable>());
     
     /**
      * reference to mbean
@@ -102,7 +102,7 @@
     /**
      * counter to track how many threads are waiting for a connection
      */
-    protected AtomicInteger waitcount = new AtomicInteger(0);
+    private AtomicInteger waitcount = new AtomicInteger(0);
     
     
//===============================================================================
     //         PUBLIC METHODS
@@ -427,9 +427,11 @@
             return;
         try {
             con.lock();
-            con.release();
+            if (con.release()) {
+                size.addAndGet(-1);
+            }
         } finally {
-            size.addAndGet(-1);
+            
             con.unlock();
         }
     }
@@ -441,7 +443,7 @@
      * @return PooledConnection
      * @throws SQLException
      */
-    protected PooledConnection borrowConnection(int wait) throws SQLException {
+    private PooledConnection borrowConnection(int wait) throws SQLException {
 
         if (isClosed()) {
             throw new SQLException("Connection pool closed.");

Modified: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java?rev=771006&r1=771005&r2=771006&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
 Sun May  3 00:18:33 2009
@@ -26,6 +26,7 @@
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
 
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -109,6 +110,8 @@
      */
     private WeakReference<JdbcInterceptor> handler = null;
     
+    private AtomicBoolean released = new AtomicBoolean(false);
+    
     
     public PooledConnection(PoolProperties prop, ConnectionPool parent) {
         instanceCount = counter.addAndGet(1);
@@ -117,6 +120,7 @@
     }
 
     public void connect() throws SQLException {
+        if (released.get()) throw new SQLException("A connection once 
released, can't be reestablished.");
         if (connection != null) {
             try {
                 this.disconnect(false);
@@ -292,7 +296,7 @@
     /**
      * This method is called if (Now - timeCheckedIn > getReleaseTime())
      */
-    public void release() {
+    public boolean release() {
         try {
             disconnect(true);
         } catch (Exception x) {
@@ -300,6 +304,7 @@
                 log.debug("Unable to close SQL connection",x);
             }
         }
+        return released.compareAndSet(false, true);
 
     }
 

Modified: 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/DefaultTestCase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/DefaultTestCase.java?rev=771006&r1=771005&r2=771006&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/DefaultTestCase.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/DefaultTestCase.java
 Sun May  3 00:18:33 2009
@@ -39,7 +39,7 @@
 public class DefaultTestCase extends TestCase {
     protected org.apache.tomcat.jdbc.pool.DataSource datasource;
     protected BasicDataSource tDatasource;
-    protected DataSource c3p0Datasource;
+    protected ComboPooledDataSource c3p0Datasource;
     protected int threadcount = 10;
     protected int iterations = 100000;
     public DefaultTestCase(String name) {

Modified: 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java?rev=771006&r1=771005&r2=771006&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java
 Sun May  3 00:18:33 2009
@@ -41,7 +41,7 @@
     protected long complete = Long.getLong("complete",20000);
     protected boolean printthread = Boolean.getBoolean("printthread");
     CountDownLatch latch = null;
-    protected void printThreadResults(TestThread[] threads, String name) {
+    protected void printThreadResults(TestThread[] threads, String name, int 
active, int expected) {
         long minfetch = Long.MAX_VALUE, maxfetch = Long.MIN_VALUE, totalfetch 
= 0;
         long maxwait = 0, minwait = Long.MAX_VALUE, averagewait = 0, totalwait 
= 0;
         float avgfetch = 0;
@@ -59,6 +59,7 @@
         System.out.println("["+name+"] Max fetch:"+(maxfetch)+" Min 
fetch:"+(minfetch)+" Average fetch:"+
                            (((float)totalfetch))/(float)threads.length);
         System.out.println("["+name+"] Max 
wait:"+(((float)maxwait)/1000000f)+"ms. Min 
wait:"+(((float)minwait)/1000000f)+"ms. Average 
wait:"+(((((float)totalwait))/(float)totalfetch)/1000000f)+" ms.");
+        System.out.println("["+name+"] Max active:"+active+" Expected 
Active:"+expected);
         
         
     }
@@ -87,7 +88,7 @@
         }
         this.run = false;
         long delta = System.currentTimeMillis() - start;
-        printThreadResults(threads,"testDBCPThreads20Connections10");
+        
printThreadResults(threads,"testDBCPThreads20Connections10",this.tDatasource.getNumActive(),10);
         tearDown();
     }
 
@@ -116,7 +117,7 @@
         }
         this.run = false;
         long delta = System.currentTimeMillis() - start;
-        printThreadResults(threads,"testPoolThreads20Connections10");
+        
printThreadResults(threads,"testPoolThreads20Connections10",this.datasource.getSize(),10);
         tearDown();
 
     }
@@ -146,7 +147,7 @@
         }
         this.run = false;
         long delta = System.currentTimeMillis() - start;
-        printThreadResults(threads,"testPoolThreads20Connections10Fair");
+        
printThreadResults(threads,"testPoolThreads20Connections10Fair",this.datasource.getSize(),10);
         tearDown();
     }
  
@@ -176,7 +177,7 @@
         }
         this.run = false;
         long delta = System.currentTimeMillis() - start;
-        printThreadResults(threads,"testPoolThreads20Connections10FairAsync");
+        
printThreadResults(threads,"testPoolThreads20Connections10FairAsync",this.datasource.getSize(),10);
         tearDown();
     }
     
@@ -205,7 +206,7 @@
         }
         this.run = false;
         long delta = System.currentTimeMillis() - start;
-        printThreadResults(threads,"testC3P0Threads20Connections10");
+        
printThreadResults(threads,"testC3P0Threads20Connections10",c3p0Datasource.getNumConnectionsAllUsers(),10);
         tearDown();
 
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to