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?
publicclassConectaBd{publicstaticResultSetconecta(Stringagente,Stringip){Stringdriver="com.mysql.jdbc.Driver";//Classe do driver JDBCStringbanco="xxx";//Nome do Banco criadoStringusuario="usuario";//Usuário do bancoStringsenha="senha";//Senha de conexãoStringstr_conn="jdbc:mysql://"+ip+":3306/"+banco;//URL de conexãotry{Class.forName(driver);Connectionconn=DriverManager.getConnection(str_conn,usuario,senha);Statementstmt=conn.createStatement();Stringsql="SELECT id, destino, cliente FROM active_calls where agente = '"+agente+"'";ResultSetrs=stmt.executeQuery(sql);return(rs);}catch(ClassNotFoundExceptionex){System.out.println("Não foi possível carregar o driver.");ex.printStackTrace();returnnull;}catch(SQLExceptionex){System.out.println("Problema com o SQL");JOptionPane.showMessageDialog(null,"Não foi possivel conectar ao banco de dados","",JOptionPane.ERROR_MESSAGE);ex.printStackTrace();returnnull;}}}
Cola o stack do erro aqui, fica mais fácil ajudar!
Abraço
E
edu2306
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
Pedro_Ribeiro
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
edu2306
Cara e se vc fechar tbm a Connection?
conn.close();
P
Pedro_Ribeiro
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.
publicstaticResultSetconecta(Stringagente,Stringip){Stringdriver="com.mysql.jdbc.Driver";//Classe do driver JDBC Stringbanco="xxx";//Nome do Banco criado Stringusuario="usuario";//Usuário do banco Stringsenha="senha";//Senha de conexão Stringstr_conn="jdbc:mysql://"+ip+":3306/"+banco;//URL de conexão Connectionconn=null;Statementstmt=null;ResultSetrs=null;try{Class.forName(driver);conn=DriverManager.getConnection(str_conn,usuario,senha);stmt=conn.createStatement();Stringsql="SELECT id, destino, cliente FROM active_calls where agente = '"+agente+"'";rs=stmt.executeQuery(sql);return(rs);}catch(ClassNotFoundExceptionex){System.out.println("Não foi possível carregar o driver.");ex.printStackTrace();returnnull;}catch(SQLExceptionex){System.out.println("Problema com o SQL");JOptionPane.showMessageDialog(null,"Não foi possivel conectar ao banco de dados","",JOptionPane.ERROR_MESSAGE);ex.printStackTrace();returnnull;}finally{conn.close();rs.close();stmt.close()}
P
Pedro_Ribeiro
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.
publicstaticResultSetconecta(Stringagente,Stringip){Stringdriver="com.mysql.jdbc.Driver";//Classe do driver JDBC Stringbanco="xxx";//Nome do Banco criado Stringusuario="usuario";//Usuário do banco Stringsenha="senha";//Senha de conexão Stringstr_conn="jdbc:mysql://"+ip+":3306/"+banco;//URL de conexão Connectionconn=null;Statementstmt=null;ResultSetrs=null;try{Class.forName(driver);conn=DriverManager.getConnection(str_conn,usuario,senha);stmt=conn.createStatement();Stringsql="SELECT id, destino, cliente FROM active_calls where agente = '"+agente+"'";rs=stmt.executeQuery(sql);return(rs);}catch(ClassNotFoundExceptionex){System.out.println("Não foi possível carregar o driver.");ex.printStackTrace();returnnull;}catch(SQLExceptionex){System.out.println("Problema com o SQL");JOptionPane.showMessageDialog(null,"Não foi possivel conectar ao banco de dados","",JOptionPane.ERROR_MESSAGE);ex.printStackTrace();returnnull;}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_Ribeiro
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
Pedro_Ribeiro
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.
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
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
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
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
Pedro_Ribeiro
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
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.