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();
}
}