You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2009/11/10 05:19:12 UTC

svn commit: r834335 - /commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPStmtPoolingBasicDataSource.java

Author: psteitz
Date: Tue Nov 10 04:19:12 2009
New Revision: 834335

URL: http://svn.apache.org/viewvc?rev=834335&view=rev
Log:
Added test case verifying that prepared statement pool acts as LRU cache.

Modified:
    commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPStmtPoolingBasicDataSource.java

Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPStmtPoolingBasicDataSource.java
URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPStmtPoolingBasicDataSource.java?rev=834335&r1=834334&r2=834335&view=diff
==============================================================================
--- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPStmtPoolingBasicDataSource.java (original)
+++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestPStmtPoolingBasicDataSource.java Tue Nov 10 04:19:12 2009
@@ -87,6 +87,61 @@
         PreparedStatement stmt4 = conn.prepareStatement("select 'a' from dual");
         assertNotNull(stmt4);
     }
+    
+    /**
+     * Verifies that the prepared statement pool behaves as an LRU cache,
+     * closing least-recently-used statements idle in the pool to make room
+     * for new ones if necessary.
+     */
+    public void testLRUBehavior() throws Exception {
+        ds.setMaxOpenPreparedStatements(3);
+        
+        Connection conn = getConnection();
+        assertNotNull(conn);
+        
+        // Open 3 statements and then close them into the pool
+        PreparedStatement stmt1 = conn.prepareStatement("select 'a' from dual");
+        PreparedStatement inner1 = (PreparedStatement) ((DelegatingPreparedStatement) stmt1).getInnermostDelegate();
+        PreparedStatement stmt2 = conn.prepareStatement("select 'b' from dual");
+        PreparedStatement inner2 = (PreparedStatement) ((DelegatingPreparedStatement) stmt2).getInnermostDelegate();
+        PreparedStatement stmt3 = conn.prepareStatement("select 'c' from dual");
+        PreparedStatement inner3 = (PreparedStatement) ((DelegatingPreparedStatement) stmt3).getInnermostDelegate();
+        stmt1.close();
+        Thread.sleep(100); // Make sure return timestamps are different
+        stmt2.close();
+        Thread.sleep(100); 
+        stmt3.close();
+        
+        // Pool now has three idle statements, getting another one will force oldest (stmt1) out
+        PreparedStatement stmt4 = conn.prepareStatement("select 'd' from dual");
+        assertNotNull(stmt4);
+        
+        // Verify that inner1 has been closed
+        try {
+            inner1.clearParameters(); 
+            fail("expecting SQLExcption - statement should be closed");
+        } catch (SQLException ex) {
+            //Expected
+        }
+        // But others are still open
+        inner2.clearParameters();
+        inner3.clearParameters();
+        
+        // Now make sure stmt1 does not come back from the dead
+        PreparedStatement stmt5 = conn.prepareStatement("select 'a' from dual");
+        PreparedStatement inner5 = (PreparedStatement) ((DelegatingPreparedStatement) stmt5).getInnermostDelegate();
+        assertNotSame(inner5, inner1);
+        
+        // inner2 should be closed now
+        try {
+            inner2.clearParameters(); 
+            fail("expecting SQLExcption - statement should be closed");
+        } catch (SQLException ex) {
+            //Expected
+        }
+        // But inner3 should still be open
+        inner3.clearParameters();  
+    }
 
     // Bugzilla Bug 27246
     // PreparedStatement cache should be different depending on the Catalog