6
respostas

Status da conexão

O que acontece com a conexão que é obtida quando é lançado uma exceção ao executar um sql com erro? Já que ela é fechada apenas após a execução do sql.

6 respostas

Fala Edson, tudo bem ?

Boa pergunta! O que acontece nesse caso quando temos algum problema após a abertura da conexão é que ele permanece aberta no banco de dados.

Você pode testar isso (no mysql, por exemplo) rodando show processlist; (ou comando equivalente, em outro banco). Assim você vai conseguir ver o banco segurando a conexão mesmo depois do problema.

Uma forma de prever e contornar esse problema seria você usar um bloco finallygarantindo o fechamento da conexão.

Um exemplo:

depois de abrir a conexao

PreparedStatement = connection.prepareStatement(seuSqlStatement);
try {
    ...
    st.execute..();
    ... // código potencialmente problematico
} catch(SQLException e) {
    // seu tratamento
} finally {
    connection.close();
}

Espero ter ajudado. Abraço!

Obrigado Rafael pela resposta, tenho mais uma dúvida, o mesmo acontece utilizando um pool de conexões?

Fala Edson,

Nesse caso já é diferente. A ideia do pool é justamente desacoplar essa responsabilidade de abrir, manter a conexão e fechar - especialmente no contexto de requisições web. O pool já mantém conexões abertas com o banco disponíveis para serem usadas, e ao final do uso dessa conexão ela não precisa ser fechada, basta disponibilizar novamente no pool, tendo assim um reaproveitamento. Se todas estiverem sendo usadas, uma nova é criada e disponibilizada no pool.

Esse mecanismo ajuda a usar o recurso de forma mais eficiente.

Rafael,

Entendo e se a conexão não voltar pro pool? Ela pode ficar bloqueada? Veja o trecho de código abaixo, o getConnection é realizado por meio de pool. Se um sql estiver errado e lançar uma exceção, a aquela conexão fica pode ficar perdida?

ResultSet resultSet;

        try {
            statement = getConnection().prepareStatement(sql);

            resultSet = statement.executeQuery();

        } catch (SQLException e) {
            throw new RegraSistemaException("Erro ao executar consulta de extração.", e); 
        } 

        return resultSet;

Fala Edson,

Exception lançadas durante o uso não invalidam a conexão, visto isso, imagino que ela deve, independente de sucesso ou insucesso no uso, voltar ao pool como disponível. Esses detalhes adicionais dependem da implementação do provedor do mecanismo de pooling utilizado, e talvez seja possível obter informações mais precisas nas documentações.

Entendi, Muito obrigado.