I had some problems with the invalidateObject function and suggest a patch.
When I use PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); driver.getConnectionPool("mypool").invalidateObject(con); The connection isn't really closed because internally PoolableConnectionFactory.destroyObject only closes PoolableConnections. The connection I got, however, is a PoolDriver.PoolGuardConnectionWrapper which extends DelegatingConnection (but not PoolableConnection). You can test this with code like this: String poolname="example"; int maxConn=10; Connection con=DriverManager.getConnection("jdbc:apache:commons:dbcp:" + poolname); Statement stm=con.createStatement(); stm.execute("create temp table tmp_dummy(col1 integer)"); stm.close(); System.out.println(" con :"+con); //something goes wrong so we have to invalidate the Connection PoolingDriver driver = (PoolingDriver) DriverManager .getDriver("jdbc:apache:commons:dbcp:"); driver.getConnectionPool(poolname).invalidateObject(con); for(int i=0;i<maxConn;i++) { Connection con2=DriverManager.getConnection("jdbc:apache:commons:dbcp:" + poolname); System.out.println("trying con "+i+" :"+con2); Statement stm2=con2.createStatement(); stm2.execute("create temp table tmp_dummy(col1 integer)"); stm2.close(); } The invalidated connection wasn't really closed and a validation query might still work. The problem becomes clear when the temp table already exists. By adding the following patch to PoolableConnectionFactory I got invalidateObject to work properly. public void destroyObject(Object obj) throws Exception { if(obj instanceof PoolableConnection) { ((PoolableConnection)obj).reallyClose(); } //begin patch invalidateConnections else if (obj instanceof DelegatingConnection) { DelegatingConnection con=(DelegatingConnection)obj; boolean rememberState=PoolingDriver.isAccessToUnderlyingConnectionAllowed(); PoolingDriver.setAccessToUnderlyingConnectionAllowed(true); if (con.getDelegate()!=null&&con.getDelegate() instanceof PoolableConnection) { ((PoolableConnection)con.getDelegate()).reallyClose(); } PoolingDriver.setAccessToUnderlyingConnectionAllowed(rememberState); } //end patch invalidateConnections } Regards, Meikel Bisping --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]