You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Cyrille Roy <cy...@free.fr> on 2008/10/02 19:27:25 UTC

DBCP: forcing recycling of small portions of active connections

Hi,

I am working with a big oracle cluster, and I would need to recycle 
active connections when returned from the pool (even if none are 
considered idle by the pool and would have otherwise be reallocated to 
another connection request immediately), as to periodically force a 
small portion connections to be recreated. This is to cope with a broken 
load balancing issue on my Oracle cluster (that misassigns all 
connection to a single db instance). It seems the DBCP does not by 
default support this using the standard properties, so I tried the 
following suggestions following the post at 
http://commons.markmail.org/search/?q=list%3Aorg.apache.commons.user+dbcp+force+order%3Adate-backward#query:list%3Aorg.apache.commons.user%20dbcp%20force%20order%3Adate-backward+page:2+mid:2ib7bfpofjytpxpl+state:results 
below

As anybody a better solution for this? Would the code sample below work? 
I.e. would Pool.invalidateObject() indeed close the underlying object, 
and lack of call to Pool.returnObject() would indeed prevent the connect 
from being served back by the pool (and won't create memory leak)?




    	GenericObjectPool connectionPool = new GenericObjectPool(null) {
    		private final Random m_random = new Random(System.currentTimeMillis());
    		
			public synchronized void returnObject(Object connection) throws Exception {
    			int rResult = m_random.nextInt(99);

			//Force 10% of the connection to recyle upon release from the pool
    			boolean shouldDropConnection = (rResult <= 10);

    			if (shouldDropConnection) {
    				//Ask the driver to close the connection
    				invalidateObject(connection);
    				
    				//And skip returning the object from the pool
    				System.out.println("initOracleYamPool: Dropping " + System.identityHashCode(connection) +  connection);
    			} else {
    				System.out.println("initOracleYamPool: Returning to pool  " + System.identityHashCode(connection) + connection);
    				//Normally return the object to the pool
    				super.returnObject(connection);
    				
    			}
			}
    		
    	};
    	connectionPool.setMaxActive(85);
		connectionPool.setMaxIdle(-1);		
		
		
		
    	String url= ...
		String username=...
		String password=...
		
		
		
    	ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, username, password);
    	                                                          //PoolableConnectionFactory(ConnectionFactory connFactory, 
    	//ObjectPool pool, 
    	//KeyedObjectPoolFactory stmtPoolFactory, 
    	//String validationQuery, 
    	//boolean defaultReadOnly, 
    	//boolean defaultAutoCommit) 
    	PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,
    				connectionPool,
    				null, //stmtPoolFactory
    				"select 1 from dual", //validationQuery
    				false, //defaultReadOnly
    				true); //defaultAutoCommit
    	
    	connectionPool.setFactory(poolableConnectionFactory);
    	PoolingDataSource pds= new PoolingDataSource(connectionPool);




I was trying to follow sample configuration of the pool (for max size 
and min) at 
http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/package-summary.html 
but it seems the connections are dropped from the pool as soon as they 
become idle (whereas I indeed had set the 
"connectionPool.setMaxIdle(-1);" to a negative value to prevent idle 
connection cleanup)

Thanks in advance for your help,
Cyrille



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org