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]

Reply via email to