Fechar conexao mysql (RESOLVIDO)

Pessoal preciso fechar a conexão que essa classe faz mas não estou conseguindo, tentei usar o .close() mas não consegui, alguma ideia?

public class ConectaBd {
   public static ResultSet conecta(String agente, String ip){
       
      String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC
      String banco = "xxx"; //Nome do Banco criado
      String usuario = "usuario"; //Usuário do banco
      String senha = "senha"; //Senha de conexão
      String str_conn = "jdbc:mysql://" + ip + ":3306/" + banco; //URL de conexão
      
      try 
         {
             Class.forName(driver);
             Connection conn = DriverManager.getConnection(str_conn, usuario, senha);
             Statement stmt = conn.createStatement();
             String sql = "SELECT id, destino, cliente FROM active_calls where agente = '" + agente + "'";
             ResultSet rs = stmt.executeQuery(sql);
             return (rs);
          }
           catch (ClassNotFoundException ex) {
              System.out.println("Não foi possível carregar o driver.");
              ex.printStackTrace();
              return null;
              
           }
           catch (SQLException ex) {
              System.out.println("Problema com o SQL");
              JOptionPane.showMessageDialog(null, "Não foi possivel conectar ao banco de dados","", JOptionPane.ERROR_MESSAGE);
              ex.printStackTrace();
              return null;
           }    
      
   }   
}

Tranquilo Pedro Ribeiro?

Cola o stack do erro aqui, fica mais fácil ajudar!

Abraço

Tente fechar no finally.

catch (SQLException ex) {  
              System.out.println("Problema com o SQL");  
              JOptionPane.showMessageDialog(null, "Não foi possivel conectar ao banco de dados","", JOptionPane.ERROR_MESSAGE);  
              ex.printStackTrace();  
              return null;  

           } finally{

            stmt.close();
            rs.close();			
}

[quote=daveiga]Tranquilo Pedro Ribeiro?

Cola o stack do erro aqui, fica mais fácil ajudar!

Abraço[/quote]

Não dá erro, preciso de algo que feche a conexão.

Não deu certo.

Cara e se vc fechar tbm a Connection?

conn.close();

[quote=edu2306]Cara e se vc fechar tbm a Connection?

conn.close();[/quote]

Estava tentando fazer assim antes de abrir o tópico e não funcionou.

cara…
Eu fiz um trabalho na faculdade e usei stmt.close() e conn.close()…
funcionou legal e fechou a conexao tranquilo…

O problema é que a variável conn está declarada dentro do try e você está tentando utilizá-la fora dele.
Faça da declaração das variáveis fora do try ou feche a conexão dentro do try.

[code]public static ResultSet conecta(String agente, String ip){

  String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC  
  String banco = "xxx"; //Nome do Banco criado  
  String usuario = "usuario"; //Usuário do banco  
  String senha = "senha"; //Senha de conexão  
  String str_conn = "jdbc:mysql://" + ip + ":3306/" + banco; //URL de conexão  
  Connection conn = null;
  Statement stmt = null;
  ResultSet rs = null;
  try   
     {  
         Class.forName(driver);  
         conn = DriverManager.getConnection(str_conn, usuario, senha);  
         stmt = conn.createStatement();  
         String sql = "SELECT id, destino, cliente FROM active_calls where agente = '" + agente + "'";  
         rs = stmt.executeQuery(sql);  
         return (rs);  
      }  
       catch (ClassNotFoundException ex) {  
          System.out.println("Não foi possível carregar o driver.");  
          ex.printStackTrace();  
          return null;  
            
       }  
       catch (SQLException ex) {  
          System.out.println("Problema com o SQL");  
          JOptionPane.showMessageDialog(null, "Não foi possivel conectar ao banco de dados","", JOptionPane.ERROR_MESSAGE);  
          ex.printStackTrace();  
          return null;  
       }   finally{      
       conn.close();
       rs.close();
       stmt.close()      

}[/code]

[quote=sgaothaich]O problema é que a variável conn está declarada dentro do try e você está tentando utilizá-la fora dele.
Faça da declaração das variáveis fora do try ou feche a conexão dentro do try.

[code]public static ResultSet conecta(String agente, String ip){

  String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC  
  String banco = "xxx"; //Nome do Banco criado  
  String usuario = "usuario"; //Usuário do banco  
  String senha = "senha"; //Senha de conexão  
  String str_conn = "jdbc:mysql://" + ip + ":3306/" + banco; //URL de conexão  
  Connection conn = null;
  Statement stmt = null;
  ResultSet rs = null;
  try   
     {  
         Class.forName(driver);  
         conn = DriverManager.getConnection(str_conn, usuario, senha);  
         stmt = conn.createStatement();  
         String sql = "SELECT id, destino, cliente FROM active_calls where agente = '" + agente + "'";  
         rs = stmt.executeQuery(sql);  
         return (rs);  
      }  
       catch (ClassNotFoundException ex) {  
          System.out.println("Não foi possível carregar o driver.");  
          ex.printStackTrace();  
          return null;  
            
       }  
       catch (SQLException ex) {  
          System.out.println("Problema com o SQL");  
          JOptionPane.showMessageDialog(null, "Não foi possivel conectar ao banco de dados","", JOptionPane.ERROR_MESSAGE);  
          ex.printStackTrace();  
          return null;  
       }   finally{      
       conn.close();
       rs.close();
       stmt.close()      

}[/code][/quote]

Quando eu inseri o seu código o Netbeans pede “adicionar clausula throws para java.sql.SQLException”. Eu adiciono e fica ok, mas uma outra classe que instancia um objeto desta também pede throws para java.sql.SQLException:

ResultSet resultado = conect.conecta(agente,ip);

Quando eu adiciono o throws na outra classe dá erro.

Será que o problema não é porque além de fechar a conexão e a sessão também está sendo fechado o resultSet, no caso acho que seria melhor você alterar esse metodo para que em vez de retornar o resultSet retornasse um objeto pronto.

Pedro, a clausula throws relança o erro pra quem efetuou a chamada do método. Isso quer dizer que tu tens que tratar a exceção (try/catch) onde tu faz a chamada do método conecta.
Realmente o Charles tem razão. Seria mais interessante retornar uma List evitando utilizar objetos de acesso ao banco(ResulSet) fora das classes de persistência.

Pedro, a clausula throws relança o erro pra quem efetuou a chamada do método. Isso quer dizer que tu tens que tratar a exceção (try/catch) onde tu faz a chamada do método conecta.
Realmente o Charles tem razão. Seria mais interessante retornar uma List evitando utilizar objetos de acesso ao banco(ResulSet) fora das classes de persistência.
[/quote]

Pelo que eu entendi você está me dizendo para mudar algo na classe a fim de ao invés de receber um ResultSet eu receba uma String por exemplo?

Se a tua query for retornar mais de uma linha tu podes criar um ArrayList de strings e retornar a lista. É melhor do que utilizar um objeto ResultSet na classe que chama o método.

Bom se tiver com um tempinho dá uma olhada na apostila fj21 da caelum, logo nos primeiros capítulos ele aborda conexão com banco de dados MySql e dá passo a passo tudo que a gente tá falando aqui.

Se a tua query for retornar mais de uma linha tu podes criar um ArrayList de strings e retornar a lista. É melhor do que utilizar um objeto ResultSet na classe que chama o método.[/quote]

Fiz a classe retornando um arraylist mas deu problema no momento de jogar esse resultado na janela do meu aplicativo.

ConectaBd conect = new ConectaBd();
   ArrayList<String> retorna = conect.conecta(agente, ip);
   jTextField4.setText(retorna.get(1));
   jTextField6.setText(retorna.get(2));
   jTextField5.setText(retorna.get(3));

Erro:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
	at java.util.ArrayList.RangeCheck(ArrayList.java:547)
	at java.util.ArrayList.get(ArrayList.java:322)
	at Jan1C2.<init>(Jan1C2.java:39)
	at Client.main(Client.java:21)

É por que o ResultSet começa do 0…

Esse erro aconteceu porque você excedeu o tamanho da lista, no Java List e array começam da posição 0 e não da 1, no caso para retornar os 3 tu tem que fazer assim

   jTextField4.setText(retorna.get(0));  
   jTextField6.setText(retorna.get(1));  
   jTextField5.setText(retorna.get(2));  

[quote=CharlesAlves]Esse erro aconteceu porque você excedeu o tamanho da lista, no Java List e array começam da posição 0 e não da 1, no caso para retornar os 3 tu tem que fazer assim

jTextField4.setText(retorna.get(0)); jTextField6.setText(retorna.get(1)); jTextField5.setText(retorna.get(2)); [/quote]

Fiz assim:

jTextField4.setText(retorna.get(0));
   jTextField6.setText(retorna.get(1));
   jTextField5.setText(retorna.get(3));

Mas o erro continua:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
	at java.util.ArrayList.RangeCheck(ArrayList.java:547)
	at java.util.ArrayList.get(ArrayList.java:322)
	at Jan1C2.<init>(Jan1C2.java:39)
	at Client.main(Client.java:21)

[quote=Pedro Ribeiro][quote=CharlesAlves]Esse erro aconteceu porque você excedeu o tamanho da lista, no Java List e array começam da posição 0 e não da 1, no caso para retornar os 3 tu tem que fazer assim

jTextField4.setText(retorna.get(0)); jTextField6.setText(retorna.get(1)); jTextField5.setText(retorna.get(2)); [/quote]

Fiz assim:

jTextField4.setText(retorna.get(0));
   jTextField6.setText(retorna.get(1));
   jTextField5.setText(retorna.get(3));

Mas o erro continua:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at Jan1C2.<init>(Jan1C2.java:39) at Client.main(Client.java:21) [/quote]

se realmente fizesse do jeito que tah ai em cima ainda tais colocando o 3 tem que ser de 0 a 2 ai ele pega os três primeiros elementos.

[quote=CharlesAlves][quote=Pedro Ribeiro][quote=CharlesAlves]Esse erro aconteceu porque você excedeu o tamanho da lista, no Java List e array começam da posição 0 e não da 1, no caso para retornar os 3 tu tem que fazer assim

jTextField4.setText(retorna.get(0)); jTextField6.setText(retorna.get(1)); jTextField5.setText(retorna.get(2)); [/quote]

Fiz assim:

jTextField4.setText(retorna.get(0));
   jTextField6.setText(retorna.get(1));
   jTextField5.setText(retorna.get(3));

Mas o erro continua:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at Jan1C2.<init>(Jan1C2.java:39) at Client.main(Client.java:21) [/quote]

se realmente fizesse do jeito que tah ai em cima ainda tais colocando o 3 tem que ser de 0 a 2 ai ele pega os três primeiros elementos.[/quote]

Realmente, coloquei como estava escrito e funcionou. Resolvido, valeu pessoal.