Olá tenho um sistema com JSP, JAVABEAN e JDBC ao qual estou enviando um crud que é o modelo de que uso em toda a aplicação,
gostaria de saber se vcs podem me ajudar com uma solução pois a crud abre diversas conexões com o banco de dados e ha um acumulo muito
grande de uso de memoria, a memoria do tomcat é usada até se estourar, ja configurei a jvm pra usar 1g de memory pool, MaxPermSize=512M
e mesmo assim consome toda ela, não há liberação de memoria nao usada.
Neste crud de modelo q eu estou enviando ela vai abrir duas conexoes q são dois beans q uso um pra “categoria” e outro pra “cor”
mas como eu tenho diversos benas ele abre mais conexões, agora imagine varias pessoas acessando o sistema. Esta um caos…
Você deve fechar as suas conexões com o bd.
Vi que você fecha os statements mas não encontrei onde você fecha as conexões.
No seu código, lgo após fechar o statment, feche tb a conexão.
perciag
fvslistas:
Você deve fechar as suas conexões com o bd.
Vi que você fecha os statements mas não encontrei onde você fecha as conexões.
No seu código, lgo após fechar o statment, feche tb a conexão.
packagebeans;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importconexao.ConexaoBD;publicclassCategoria{staticConnectionconexao;staticStatementdeclaracao;staticResultSetresultado;privateStringatualiza;privatebooleaninserido;privateStringpesquisa;publicCategoria(){try{if(conexao==null)conexao=ConexaoBD.getConnection();}catch(SQLExceptione){System.out.println("Não foi possível Connecta() pedidos");conexao=null;}catch(Exceptione){System.out.println("Driver não carregado");}}publicResultSetgetTodos()throwsSQLException{try{declaracao=conexao.createStatement();pesquisa="SELECT * FROM categorias ORDER BY categoria";resultado=declaracao.executeQuery(pesquisa);if(resultado.next()){resultado.beforeFirst();}else{resultado=null;declaracao.close();}}catch(SQLExceptione){System.out.println("Não foi possivel getTodos() classe categorias");}returnresultado;}publicResultSetgetEspecifico(Stringcategoria)throwsSQLException{try{declaracao=conexao.createStatement();pesquisa="SELECT * FROM categorias WHERE categoria LIKE '"+categoria+"%'";resultado=declaracao.executeQuery(pesquisa);if(resultado.next()){resultado.beforeFirst();}else{resultado=null;declaracao.close();}}catch(SQLExceptione){System.out.println("Não foi possivel getEspecifico() classe categorias");}returnresultado;}publicResultSetgetEspecificoID(intcategoriaID)throwsSQLException{try{declaracao=conexao.createStatement();pesquisa="SELECT * FROM categorias WHERE categoriaID = '"+categoriaID+"'";resultado=declaracao.executeQuery(pesquisa);if(resultado.next()){resultado.beforeFirst();}else{resultado=null;declaracao.close();}}catch(SQLExceptione){System.out.println("Não foi possivel getEspecificoID() classe categorias");}returnresultado;}publicbooleanverifica(Stringcategoria)throwsSQLException{resultado=getEspecifico(categoria);if(resultado==null){inserido=false;System.out.println("resultado == null classe categorias");}else{inserido=true;}returninserido;}publicvoidaddRecategoriad(Stringcategoria,Stringdescricao)throwsSQLException{atualiza="INSERT INTO categorias (categoriaID, categoria, descricao) VALUES (null, '"+categoria+"', '"+descricao+"')";declaracao=conexao.createStatement();intresultado=declaracao.executeUpdate(atualiza);declaracao.close();}publicvoiddelRecategoriad(intcategoriaID)throwsSQLException{atualiza="DELETE FROM categorias WHERE categoriaID = '"+categoriaID+"'";declaracao=conexao.createStatement();intresultado=declaracao.executeUpdate(atualiza);declaracao.close();}publicvoidupdateRecategoriad(intcategoriaID,Stringcategoria,Stringdescricao)throwsSQLException{atualiza="UPDATE categorias SET categoria = '"+categoria+"', descricao = '"+descricao+"' WHERE categoriaID = '"+categoriaID+"'";declaracao=conexao.createStatement();intresultado=declaracao.executeUpdate(atualiza);declaracao.close();}}
Por exemplo esse é um dos codigos q tenho pra fazer acesso ao banco de dados, mas quando eu coloco para fechar o statement assim ô
<blockquote>public ResultSet getTodos() throws SQLException {
try {
declaracao = conexao.createStatement();
pesquisa = “SELECT * FROM categorias ORDER BY categoria”;
resultado = declaracao.executeQuery(pesquisa);
if(resultado.next()){
resultado.beforeFirst();}else{
resultado=null;declaracao.close();}
}catch(SQLExceptione){
System.out.println("Não foi possivel getTodos() classe categorias");}
///Incluirofecharstantementdeclaracao.close();returnresultado;}
ele dá erro falando q eu no posso fechar antes do resultado. Sinceramente ja estou trabalhando tanto no codigo que ja não exergo soluçoes. Se alguem puder me ajudar… Agradeço----
F
fvslistas
Para usar jdbc vc basicamente faz assim:
abra conexão
crie statement a partir da conexão
execute consultas que retornem (ou não) um ResultSet
trate o seu ResultSet transforme-o em algo que você vá usar como uma lista de objetos, sei lá.
feche o resultset
feche o statement
feche aconexão.
O que acontece é q vc não pode usar o rs se fechar o statement
Não pode usar statement nem resultset se fechar a conexão.
Então, pegando um de seus métodos, por exemplo o getEspecificoID. Este método retorna um ResultSet. Alguém vai chamar o seu método e tratar este ResultSet. Só depois de tal tratamento vc pode fechar o resultset, statement e conexão. Ou seja, Só quem vai tratar o resultset é q sabe o melhor momento para liberar os recursos.
O lance está na modelagem que vc fez. Vc encapsulou o acesso a algumas classes e objetos de acesso a banco, mas não encapsulou outras. Faça com que seu método não retorne um resultset, faça com que ele mesmo trate o resultset e retorne um objeto de mais alto nível tipo um List<Categoria>.
Existem formas mais apropriadas como o pool de conexões, jpa, etc. Mas para aprender a usar jdbc as dicas acima já valem.
perciag
fvslistas:
Para usar jdbc vc basicamente faz assim:
abra conexão
crie statement a partir da conexão
execute consultas que retornem (ou não) um ResultSet
trate o seu ResultSet transforme-o em algo que você vá usar como uma lista de objetos, sei lá.
feche o resultset
feche o statement
feche aconexão.
O que acontece é q vc não pode usar o rs se fechar o statement
Não pode usar statement nem resultset se fechar a conexão.
Então, pegando um de seus métodos, por exemplo o getEspecificoID. Este método retorna um ResultSet. Alguém vai chamar o seu método e tratar este ResultSet. Só depois de tal tratamento vc pode fechar o resultset, statement e conexão. Ou seja, Só quem vai tratar o resultset é q sabe o melhor momento para liberar os recursos.
O lance está na modelagem que vc fez. Vc encapsulou o acesso a algumas classes e objetos de acesso a banco, mas não encapsulou outras. Faça com que seu método não retorne um resultset, faça com que ele mesmo trate o resultset e retorne um objeto de mais alto nível tipo um List<Categoria>.
Existem formas mais apropriadas como o pool de conexões, jpa, etc. Mas para aprender a usar jdbc as dicas acima já valem.
Obrigado pela atenção, estou criando uma nova versao do sistema em hibernate, mas este ja esta sendo usado pela empresa e vai demorar um pouco antes de colocar o novo no ar eu precisava resolver esse problema no momento, ja estudei varias formas de fechar essa conexao, mas acho q o problema pode estar aki especificamente.