You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by di...@apache.org on 2004/07/11 21:09:50 UTC

cvs commit: jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources TestSharedPoolDataSource.java

dirkv       2004/07/11 12:09:50

  Modified:    dbcp/src/java/org/apache/commons/dbcp/cpdsadapter
                        DriverAdapterCPDS.java
               dbcp/src/test/org/apache/commons/dbcp TestManual.java
               dbcp/src/test/org/apache/commons/dbcp/datasources
                        TestSharedPoolDataSource.java
  Log:
  Bugzilla Bug 27494:	enhancements to prepared statement in DriverAdapterCPDS
  - apply patch from Todd Carmichael
  
  Revision  Changes    Path
  1.9       +39 -7     jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/cpdsadapter/DriverAdapterCPDS.java
  
  Index: DriverAdapterCPDS.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/cpdsadapter/DriverAdapterCPDS.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DriverAdapterCPDS.java	28 Feb 2004 12:18:17 -0000	1.8
  +++ DriverAdapterCPDS.java	11 Jul 2004 19:09:50 -0000	1.9
  @@ -113,6 +113,7 @@
       private int _timeBetweenEvictionRunsMillis = -1;
       private int _numTestsPerEvictionRun = -1;
       private int _minEvictableIdleTimeMillis = -1;
  +    private int _maxPreparedStatements = -1;
   
       private boolean getConnectionCalled = false;
   
  @@ -147,13 +148,28 @@
           */
           KeyedObjectPool stmtPool = null;
           if (isPoolPreparedStatements()) {
  -            stmtPool = new GenericKeyedObjectPool(null,
  -                getMaxActive(), GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW, 0, 
  -                getMaxIdle(), false, false, getTimeBetweenEvictionRunsMillis(),
  -                getNumTestsPerEvictionRun(), 
  -                getMinEvictableIdleTimeMillis(), false);            
  +            if (getMaxPreparedStatements() == -1)
  +            {
  +                // since there is no limit, create a prepared statement pool with an eviction thread
  +                //  evictor settings are the same as the connection pool settings.
  +                stmtPool = new GenericKeyedObjectPool(null,
  +                    getMaxActive(), GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW, 0,
  +                    getMaxIdle(), false, false,
  +                    getTimeBetweenEvictionRunsMillis(),getNumTestsPerEvictionRun(),getMinEvictableIdleTimeMillis(),
  +                    false);
  +            }
  +            else
  +            {
  +                // since there is limit, create a prepared statement pool without an eviction thread
  +                //  pool has LRU functionality so when the limit is reached, 15% of the pool is cleared.
  +                // see org.apache.commons.pool.impl.GenericKeyedObjectPool.clearOldest method
  +                stmtPool = new GenericKeyedObjectPool(null,
  +                    getMaxActive(), GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW, 0,
  +                    getMaxIdle(), getMaxPreparedStatements(), false, false,
  +                    -1,0,0, // -1 tells the pool that there should be no eviction thread.
  +                    false);
  +            }
           }
  -        
           // Workaround for buggy WebLogic 5.1 classloader - ignore the
           // exception upon first invocation.
           try {
  @@ -201,6 +217,8 @@
               String.valueOf(getNumTestsPerEvictionRun())));
           ref.add(new StringRefAddr("minEvictableIdleTimeMillis", 
               String.valueOf(getMinEvictableIdleTimeMillis())));
  +        ref.add(new StringRefAddr("maxPreparedStatements",
  +            String.valueOf(getMaxPreparedStatements())));
   
           return ref;
       }
  @@ -275,6 +293,11 @@
                       setMinEvictableIdleTimeMillis(
                           Integer.parseInt(ra.getContent().toString()));
                   }
  +                ra = ref.get("maxPreparedStatements");
  +                if (ra != null && ra.getContent() != null) {
  +                    setMaxPreparedStatements(
  +                        Integer.parseInt(ra.getContent().toString()));
  +                }
   
                   cpds = this;
               }
  @@ -552,5 +575,14 @@
       public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
           assertInitializationAllowed();
           _minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
  +    }
  +    public int getMaxPreparedStatements()
  +    {
  +        return _maxPreparedStatements;
  +    }
  +
  +    public void setMaxPreparedStatements(int maxPreparedStatements)
  +    {
  +        _maxPreparedStatements = maxPreparedStatements;
       }
   }
  
  
  
  1.21      +17 -1     jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/TestManual.java
  
  Index: TestManual.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/TestManual.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- TestManual.java	20 May 2004 17:54:50 -0000	1.20
  +++ TestManual.java	11 Jul 2004 19:09:50 -0000	1.21
  @@ -69,6 +69,22 @@
           driver.closePool("test");
           DriverManager.deregisterDriver(driver);
       }
  +    
  +    public void test1() {
  +        GenericObjectPool connectionPool = new GenericObjectPool(null);
  +        ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string","username","password");
  +        PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
  +        PoolingDataSource dataSource = new PoolingDataSource(connectionPool);
  +    }
  +
  +    public void test2() {
  +        GenericObjectPool connectionPool = new GenericObjectPool(null);
  +        ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string","username","password");
  +        PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
  +        PoolingDriver driver = new PoolingDriver();
  +        driver.registerPool("example",connectionPool);
  +    }
  +
   
       /** @see http://issues.apache.org/bugzilla/show_bug.cgi?id=28912 */
       public void testReportedBug28912() throws Exception {
  
  
  
  1.8       +76 -2     jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java
  
  Index: TestSharedPoolDataSource.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TestSharedPoolDataSource.java	28 Feb 2004 11:47:52 -0000	1.7
  +++ TestSharedPoolDataSource.java	11 Jul 2004 19:09:50 -0000	1.8
  @@ -412,7 +412,6 @@
           conn3.close();
       }     
   
  -
       // Bugzilla Bug 24136 ClassCastException in DriverAdapterCPDS 
       // when setPoolPreparedStatements(true)
       public void testPoolPrepareStatement() throws Exception 
  @@ -429,5 +428,80 @@
           rset.close();
           stmt.close();
           conn.close();
  +    }
  +
  +    public void testPoolPreparedStatements() throws Exception {
  +        DriverAdapterCPDS mypcds = new DriverAdapterCPDS();
  +        DataSource myds = null;
  +        mypcds.setDriver("org.apache.commons.dbcp.TesterDriver");
  +        mypcds.setUrl("jdbc:apache:commons:testdriver");
  +        mypcds.setUser("foo");
  +        mypcds.setPassword("bar");
  +        mypcds.setPoolPreparedStatements(true);
  +        mypcds.setMaxPreparedStatements(10);
  +
  +        SharedPoolDataSource tds = new SharedPoolDataSource();
  +        tds.setConnectionPoolDataSource(mypcds);
  +        tds.setMaxActive(getMaxActive());
  +        tds.setMaxWait((int)(getMaxWait()));
  +        tds.setDefaultTransactionIsolation(
  +            Connection.TRANSACTION_READ_COMMITTED);
  +
  +        myds = tds;
  +
  +        Connection conn = ds.getConnection();
  +        PreparedStatement stmt = null;
  +        ResultSet rset = null;
  +
  +        assertTrue(null != conn);
  +
  +        stmt = conn.prepareStatement("select * from dual");
  +        assertTrue(null != stmt);
  +        long l1HashCode = stmt.hashCode();
  +        rset = stmt.executeQuery();
  +        assertTrue(null != rset);
  +        assertTrue(rset.next());
  +        rset.close();
  +        stmt.close();
  +
  +        stmt = conn.prepareStatement("select * from dual");
  +        assertTrue(null != stmt);
  +        long l2HashCode = stmt.hashCode();
  +        rset = stmt.executeQuery();
  +        assertTrue(null != rset);
  +        assertTrue(rset.next());
  +        rset.close();
  +        stmt.close();
  +
  +        // statement pooling is not enabled, we should get different statements
  +        assertTrue(l1HashCode != l2HashCode);
  +        conn.close();
  +        conn = null;
  +
  +        conn = myds.getConnection();
  +
  +        stmt = conn.prepareStatement("select * from dual");
  +        assertTrue(null != stmt);
  +        long l3HashCode = stmt.hashCode();
  +        rset = stmt.executeQuery();
  +        assertTrue(null != rset);
  +        assertTrue(rset.next());
  +        rset.close();
  +        stmt.close();
  +
  +        stmt = conn.prepareStatement("select * from dual");
  +        assertTrue(null != stmt);
  +        long l4HashCode = stmt.hashCode();
  +        rset = stmt.executeQuery();
  +        assertTrue(null != rset);
  +        assertTrue(rset.next());
  +        rset.close();
  +        stmt.close();
  +
  +        // prepared statement pooling is working
  +        assertTrue(l3HashCode == l4HashCode);
  +        conn.close();
  +        conn = null;
  +
       }
   }
  
  
  

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