Galera estou refazendo a camada de persistencia de uma aplicação e gostaria de um exemplo usando DAO e C3P0 (não vou usar Hibernate). Eu fiz alguma coisa porém estou tendo problemas na hora de liberar as conexões.
Seria interessante fazer uma factory dos métodos de acesso da interface Connection ?? (preparedStatement, statement e etc). Alguém ja fez algo nessa linha ??
Segue as classes que ja fiz:
Classe que encapsula os métodos de controle de conexão…
[code]public final class TControleBancoDeDados
{
private static ComboPooledDataSource cpds = null;
private static Logger log = Logger.getLogger(TControleBancoDeDados.class);
private TControleBancoDeDados()
{
super();
}
public static boolean liberaConexao(Connection conn, boolean comitarTransacao)
{
try
{
if (comitarTransacao)
{
conn.commit();
}
if (conn != null)
{
conn.close();
}
return true;
}
catch (Exception e)
{
log.error(e);
return false;
}
}
public static Connection getDbConnection()
{
try
{
if (cpds == null)
{
cpds = new ComboPooledDataSource();
cpds.setDriverClass(IConstantesSistema.DRIVER_BD);
cpds.setJdbcUrl(IConstantesSistema.STRING_CONEXAO);
cpds.setAcquireIncrement(1);
cpds.setUser(IConstantesSistema.LOGIN_BANCO);
cpds.setPassword(IConstantesSistema.SENHA_BANCO);
cpds.setMaxPoolSize(IConstantesSistema.MAXIMO_CONEXOES);
cpds.setMinPoolSize(IConstantesSistema.MINIMO_CONEXOES);
cpds.setInitialPoolSize(IConstantesSistema.MINIMO_CONEXOES);
cpds.setAcquireRetryAttempts(IConstantesSistema.NUMERO_TENTATIVAS);
cpds.setTestConnectionOnCheckin(true);
cpds.setIdleConnectionTestPeriod(60);
cpds.setAutoCommitOnClose(true);
cpds.setNumHelperThreads(3);
cpds.setUnreturnedConnectionTimeout(0);
cpds.setBreakAfterAcquireFailure(false);
cpds.setMaxIdleTimeExcessConnections(30);
cpds.setUnreturnedConnectionTimeout(600);
cpds.setAutoCommitOnClose(false);
}
log.info("Criando conexão");
log.info("Quantidade de conex�es abertas " + cpds.getNumConnections());
Connection conn = cpds.getConnection();
conn.setAutoCommit(false);
return conn;
}
catch (Exception e)
{
log.error(e);
return null;
}
}
public static void efetuaRollBack(Connection conn)
{
try
{
if ((conn != null) && (!conn.isClosed()))
{
conn.rollback();
conn.close();
}
}
catch (Exception e)
{
log.error(e);
}
}
}[/code]
classe que encapsula os métodos da interface connection:
[code]public class TOperacoesBancoDeDados
{
private static Logger log = Logger.getLogger(TOperacoesBancoDeDados.class);
public static TOperacoesBancoDeDados mySelf = new TOperacoesBancoDeDados();
private TOperacoesBancoDeDados()
{
super();
}
public static TOperacoesBancoDeDados getOperacoes()
{
return mySelf;
}
public Statement createStatement()
{
try
{
return this.obtemConexaoBanco().createStatement();
}
catch (SQLException ex)
{
log.error(ex);
return null;
}
}
public CallableStatement prepareCall(String sql)
{
try
{
return obtemConexaoBanco().prepareCall(sql);
}
catch (SQLException ex)
{
log.error(ex);
return null;
}
}
public final PreparedStatement prepareStatement(String sql)
{
try
{
return obtemConexaoBanco().prepareStatement(sql);
}
catch (SQLException ex)
{
log.error(ex);
return null;
}
}
public void liberaConexaoStatement(Statement statement, boolean comitaTransacao)
{
try
{
TControleBancoDeDados.liberaConexao(statement.getConnection(), comitaTransacao);
}
catch (SQLException ex)
{
log.error(ex);
}
}
public void liberaConexaoCallableStatement(CallableStatement callableStatement, boolean comitaTransacao)
{
try
{
TControleBancoDeDados.liberaConexao(callableStatement.getConnection(), comitaTransacao);
}
catch (SQLException ex)
{
log.error(ex);
}
}
public void liberaConexaoPreparedStatement(PreparedStatement preparedStatement, boolean comitaTransacao)
{
try
{
TControleBancoDeDados.liberaConexao(preparedStatement.getConnection(), comitaTransacao);
}
catch (SQLException ex)
{
log.error(ex);
}
}
public void efetuaRollBackPreparedStatement(PreparedStatement preparedStatement){
try
{
TControleBancoDeDados.efetuaRollBack(preparedStatement.getConnection());
}
catch (Exception e)
{
log.error(e);
}
}
private Connection obtemConexaoBanco()
{
try
{
return TControleBancoDeDados.getDbConnection();
}
catch (Exception ex)
{
ex.printStackTrace();
return null;
}
}
}
[/code]
Sugestões e críticas são muito bem vindas…