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