Problemas com Pool de Conexões usando DBCP

Pessoal,

Tenho um web service que dispara uma procedure em um banco oracle remoto, para este serviço implementei um pool de conexões utilizando o apache DBCP, mas estou tendo problema qdo. o pool é executado pela primeira vez, para testar criei um codigo onde disparo 100 threads que abrem conexao com o banco, e em todos os testes no primeiro lote de threads sempre 20 conexões falham, devido ao limite de conexões configurado para o meu usuario (10 conexões), ja no segundo lote de 100 threads o pool funciona, respeitando o nro. de conexões configurado no meu código, e parece que o parametro setMaxWait(5000L) tb nao esta sendo respeitado, ja tentei aumentar este falor e sempre as 20 threads que falham. Segue abaixo meu código, se alguém entende do assunto ou passou por isso e puder me ajudar.

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;


import org.apache.commons.dbcp.BasicDataSource;
import org.apache.log4j.Logger;


public class Dbcp {
	
	private static Dbcp instance = null; 
	private DataSource ds; 
	private static int maxConnections; 
	private static Logger logger = Logger.getLogger(Utilitarios.class);
	private Utilitarios obj  = new Utilitarios();
	private Properties appProps  = obj.carregaPropriedades(); 
	private static String ip = "";
	private static String port = "";
	private static String sid = "";
	private static String user = "";
	private static String pass = "";
			
	public static Dbcp getInstance(String tp) {
		
		if(instance == null) { 
			instance = new Dbcp(tp); 
			    	
		} 
		return instance; 
	} 
	
	public Dbcp(String tp){
		ip   = appProps.getProperty("ip."+ tp);
    	        port = appProps.getProperty("port."+ tp);
    	        sid  = appProps.getProperty("sid."+ tp);
    	        user = appProps.getProperty("user."+ tp);
    	        pass = appProps.getProperty("pass."+ tp);
		maxConnections = 10;
		ds = setupDataSource(); 
	}

    public static DataSource setupDataSource() {
    	    	
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
        ds.setUsername(user); 
        ds.setPassword(pass); 
        ds.setUrl("jdbc:oracle:thin:@" + ip + ":" + port + ":" + sid); 
        ds.setInitialSize(10);
        ds.setMaxActive(maxConnections); 
        ds.setMaxWait(5000L); 
        ds.setMaxIdle(10);
        ds.setMinIdle(5);
        ds.setDefaultAutoCommit(true);
        ds.setDefaultReadOnly(true);
        ds.setPoolPreparedStatements(true);
        ds.setMaxOpenPreparedStatements(10);
        ds.setRemoveAbandoned(true);
        ds.setRemoveAbandonedTimeout(60);
        ds.setLogAbandoned(true);
                     
        return ds; 
    }

    public void printDataSourceStats() throws SQLException {
        BasicDataSource bds = (BasicDataSource) ds;
        logger.info("Num Active Connections: " + bds.getNumActive());
        logger.info("NumIdle: " + bds.getNumIdle());
    }
    
    public Connection getConn() throws SQLException { 
    	return ds.getConnection(); 
    } 

    public void shutdownDataSource() throws SQLException {
        BasicDataSource bds = (BasicDataSource) ds;
        bds.close();
    }
    
    
}