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]