Resolvido - Objeto Connection é fechado automaticamente numa exceção?

Dúvida téorica basicona, mas…

trecho do meu código:

try{
            Connection conexao = DAOManager.getNovaConexao();
            //codigo com preparedstatement e etc... 
            conexao.close();  
       }
       catch (Exception e){
          e.printStackTrace();
       }

Se ocorrer tudo bem, ele abre a conexao, executa o comando sql e fecha a conexao.

A questão é, se ocorrer algum erro no try(um erro na sentença sql, por exemplo, colocar “selct” em vez de “select”) é executado a exceção, mas a conexao é fechada ou devo fechá-la manualmente no catch?

Ela não é fechada automaticamente nesse caso. Use um bloco finally para isso.
Abraços

[quote=tnaires]Ela não é fechada automaticamente nesse caso. Use um bloco finally para isso.
Abraços[/quote]

valeu cara, dúvida respondida.

minha preocupação era dá um erro e ficar conexões abertas de bobeira.

TKS

Connexões são recursos caros. Vc deve assegurar que eles não ficam abertos por mais tempo que o necessário
e isso independentemente se aconteceu erro ou não.

A forma padrão de trabalhar com Connection é assim :

Connection conexao=null;
try {
      try{
           conexao = DAOManager.getNovaConexao();
            //codigo com preparedstatement e etc... 
          
       } finally {
               if (conexao!=null){
                    conexao.close();  
               }
        }
} catch (SQLException e){
           // trata ou encapsula para lançar de novo
}

ou 

Connection conexao=null;

      try{
           conexao = DAOManager.getNovaConexao();
            //codigo com preparedstatement e etc... 
      } catch (SQLException e){
           // trata ou encapsula para lançar de novo
      } finally {
          if (conexao!=null){
              try {
                    conexao.close();  
              } catch (SQLException e){
                     // trata ou encapsula para lançar de novo
              }
          }
      }

A primeira forma é usada quando o erro no fechamento impossibilita o método.
A segudna forma, quando não.

Valeu cara, provavelmente vou criar um metodo só para fechar as conexoes :slight_smile:

Porém, saindo da parte prática e indo pra téorica…

O que seria na verdade uma conexao? Tá, pergunta óbvia… Dã… mas quero saber :oops: e porque elas seriam “recursos caros”? :?:

agradço a ajuda e a paciencia… :wink:

Não sei se vocês sabem, mas o bloco finnaly é executado sempre, mas sempre mesmo, mesmo se tiver um return no bloco try :shock:! Por isso, fechar a conexão nele é essencial.

Lamento desiludi-lo mas não ha muita magina nesse conceito não :wink:
Conexão é isso mesmo, um ligação fisica entre o seu sistema e o banco através da rede.
É um recurso caro porque o numero de conexções abertas influencia na performance e o ato de a criar afeta coisas de baixo nivel (protocolos de rede ,etc…) e isso envolve consumir recursos do sistema além de memoria e processador. Por isso é caro, no sentido que envolve muitos recursos fisicos do sistema e da rede.

[quote=sergiotaborda]
Lamento desiludi-lo mas não ha muita magina nesse conceito não :wink:
Conexão é isso mesmo, um ligação fisica entre o seu sistema e o banco através da rede.
É um recurso caro porque o numero de conexções abertas influencia na performance e o ato de a criar afeta coisas de baixo nivel (protocolos de rede ,etc…) e isso envolve consumir recursos do sistema além de memoria e processador. Por isso é caro, no sentido que envolve muitos recursos fisicos do sistema e da rede.[/quote]

Sérgio, valeu mesmo todos os esclarecimentos :thumbup:

tks