You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ps...@apache.org on 2006/05/20 19:27:48 UTC

svn commit: r408045 - in /jakarta/commons/proper/dbcp/trunk: build.xml project.xml src/test/org/apache/commons/dbcp/TestPoolableConnection.java

Author: psteitz
Date: Sat May 20 10:27:47 2006
New Revision: 408045

URL: http://svn.apache.org/viewvc?rev=408045&view=rev
Log:
Updated [pool] dependency to 1.3

Modified:
    jakarta/commons/proper/dbcp/trunk/build.xml
    jakarta/commons/proper/dbcp/trunk/project.xml
    jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPoolableConnection.java

Modified: jakarta/commons/proper/dbcp/trunk/build.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/build.xml?rev=408045&r1=408044&r2=408045&view=diff
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/build.xml (original)
+++ jakarta/commons/proper/dbcp/trunk/build.xml Sat May 20 10:27:47 2006
@@ -23,7 +23,9 @@
       <property name="cp" value=""/>
 
       <!-- now combine the classpaths -->
-      <property name="classpath" value="${cp}:${commons-pool.jar}:${commons-collections.jar}:${jdbc20ext.jar}:${junit.jar}:${jndi.jar}:${sax2.jar}"/>
+      <property name="classpath" value="${cp}:${commons-pool.jar}:
+      	${commons-collections.jar}:${jdbc20ext.jar}:${junit.jar}:${jndi.jar}:
+      	${sax2.jar}:${naming-common.jar}:${naming-java.jar}:${hsqldb.jar}"/>
 
       <property name="name" value="commons-dbcp"/>
       <property name="title" value="Jakarta Commons Database Pooling Package"/>
@@ -56,6 +58,7 @@
    <!-- ######################################################### -->
 
    <target name="clean" depends="init" description="removes generated files">
+   	  <echo>${classpath}</echo>
       <delete dir="${build.dir}"/>
       <delete dir="${dist.dir}"/>
    </target>

Modified: jakarta/commons/proper/dbcp/trunk/project.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/project.xml?rev=408045&r1=408044&r2=408045&view=diff
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/project.xml (original)
+++ jakarta/commons/proper/dbcp/trunk/project.xml Sat May 20 10:27:47 2006
@@ -182,7 +182,7 @@
     <dependency>
       <groupId>commons-pool</groupId>
       <artifactId>commons-pool</artifactId>
-      <version>1.2</version>
+      <version>1.3</version>
     </dependency>
 
     <dependency>

Modified: jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPoolableConnection.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPoolableConnection.java?rev=408045&r1=408044&r2=408045&view=diff
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPoolableConnection.java (original)
+++ jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPoolableConnection.java Sat May 20 10:27:47 2006
@@ -16,7 +16,8 @@
 
 package org.apache.commons.dbcp;
 
-import java.sql.Connection;
+import java.sql.Connection; // 
+import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 
@@ -26,6 +27,9 @@
 
 import org.apache.commons.pool.ObjectPool;
 import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool.KeyedObjectPoolFactory;
+import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory;
+
 
 /**
  * @author James Ring
@@ -102,5 +106,118 @@
 
         assertEquals("The pool should have no active connections", 
             0, pool.getNumActive());
+    }
+    
+    public void testDeadlock() {
+        System.out.println("Loading drivers");
+        try {
+            Class.forName("org.hsqldb.jdbcDriver");
+            Class.forName("org.apache.commons.dbcp.PoolingDriver");
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+
+        System.out.println("Setting up pool");
+
+        try {
+            GenericObjectPool.Config config = new GenericObjectPool.Config();
+            config.maxActive = 10;
+            config.minIdle = 2; // Idle limits are low to allow more possibility of locking.
+            config.maxIdle = 4; // Locking only occurs when there are 0 idle connections in the pool.
+            config.maxWait = 5000L;
+            config.testOnBorrow = true;
+            config.testOnReturn = false;
+            config.testWhileIdle = true;
+            // Locking still occurs whether these tests are performed or not.
+            config.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
+            // Locking still occurs regardless of the exhausted action.
+            config.timeBetweenEvictionRunsMillis = 3000L; // The Evictor thread is involved in the lock, so run it quite often.
+            config.minEvictableIdleTimeMillis = 6000L;
+            config.numTestsPerEvictionRun = 3;
+
+            ObjectPool op = new GenericObjectPool(null, config);
+            KeyedObjectPoolFactory kp = new GenericKeyedObjectPoolFactory(null);
+
+            ConnectionFactory cf = new DriverManagerConnectionFactory(
+                    "jdbc:hsqldb:target/hsqldb", "sa", "");
+            PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf,
+                    op, null, null, false, true);
+            // Locking still occurs whether there is a validation query or not.
+            PoolingDriver pd = (PoolingDriver) DriverManager
+                    .getDriver("jdbc:apache:commons:dbcp:");
+            pd.registerPool("PoolName", op);
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        System.out.println("Initialized");
+
+        int ACTIVE = 10;
+
+        Connection[] c = new Connection[ACTIVE];
+
+        try {
+            printPoolStatus();
+
+            int j = 0;
+            // Loop forever to create a high load.
+            while (j < 5000) {
+                // Create a number of connections.
+                for (int i = 0; i < ACTIVE; ++i) {
+                    c[i] = DriverManager
+                            .getConnection("jdbc:apache:commons:dbcp:PoolName");
+                    //printPoolStatus();
+                }
+                // Then immmediately drop them.
+                for (int i = 0; i < ACTIVE; ++i) {
+                    try {
+                        if (c[i] != null) {
+                            c[i].close();
+                            //printPoolStatus();
+                            c[i] = null;
+                        }
+                    } catch (SQLException e) {
+                        e.printStackTrace();
+                    }
+                }
+                j++;
+            }
+
+        } catch (Throwable e) {
+            e.printStackTrace();
+
+        } finally {
+            // Close down any open connetions.
+            for (int i = 0; i < ACTIVE; ++i) {
+                try {
+                    if (c[i] != null)
+                        c[i].close();
+                } catch (SQLException e) {
+                }
+            }
+
+            System.out.println("Closing pool");
+            try {
+                PoolingDriver pd = (PoolingDriver) DriverManager
+                        .getDriver("jdbc:apache:commons:dbcp:");
+                pd.closePool("PoolName");
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+            System.out.println("Pool closed");
+        }
+    }
+
+    /**
+     * Display pool status.  Locks still occur even if this method is never
+     called.
+     */
+    private static void printPoolStatus() throws SQLException {
+        PoolingDriver pd = (PoolingDriver) DriverManager
+                .getDriver("jdbc:apache:commons:dbcp:");
+        ObjectPool op = pd.getConnectionPool("PoolName");
+
+        System.out.println("Active / idle: " + op.getNumActive() + " / "
+                + op.getNumIdle());
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org