Fechar conexao mysql (RESOLVIDO)

19 respostas
P

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

19 Respostas

daveiga

Tranquilo Pedro Ribeiro?

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

Abraço

E

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

daveiga:
Tranquilo Pedro Ribeiro?

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

Abraço

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

Não deu certo.

E

Cara e se vc fechar tbm a Connection?

conn.close();

P

edu2306:
Cara e se vc fechar tbm a Connection?

conn.close();

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

fernandosavio

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

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.

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()      
   }
P
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.
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()      
   }

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.

CharlesAlves

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.

sgaothaich

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.

P

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.

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?

sgaothaich

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.

CharlesAlves

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.

P

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.

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)
drsmachado

É por que o ResultSet começa do 0…

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));
P

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

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)
CharlesAlves

Pedro Ribeiro:
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));

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)

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.

P

CharlesAlves:
Pedro Ribeiro:
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));

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)

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.

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

Criado 21 de setembro de 2011
Ultima resposta 29 de set. de 2011
Respostas 19
Participantes 7