Problemas sistema com JSP, JAVABEAN e JDBC

4 respostas
perciag

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…

Agradeço antecipadamente pela atenção de todos

4 Respostas

F

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.

package beans;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import conexao.ConexaoBD;

	public class Categoria {
	    static Connection conexao;
	    static Statement  declaracao;
	    static ResultSet  resultado;    
	    private String    atualiza;    
	    private boolean   inserido;
	    private String    pesquisa;
	    
	    public Categoria() {
			try {
				if (conexao == null)
				conexao = ConexaoBD.getConnection();
			} catch (SQLException e) {
				System.out.println("Não foi possível Connecta() pedidos");
				conexao = null;
			} catch (Exception e) {
				System.out.println("Driver não carregado");
			}
	    }

	    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 (SQLException e) {
	            System.out.println("Não foi possivel getTodos()  classe categorias");
	        }

	        return resultado;
	    }

	    public ResultSet getEspecifico(String categoria) throws SQLException {
	        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 (SQLException e) {
	            System.out.println("Não foi possivel getEspecifico()  classe categorias");
	        }

	        return resultado;
	    }


	    public ResultSet getEspecificoID(int categoriaID) throws SQLException {
	        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 (SQLException e) {
	            System.out.println("Não foi possivel getEspecificoID()  classe categorias");
	        }

	        return resultado;
	    }

	    public boolean verifica(String categoria) throws SQLException {
	        resultado = getEspecifico(categoria);

	        if (resultado == null) {
	            inserido = false;
	            System.out.println("resultado == null  classe categorias");
	        } else {
	            inserido = true;
	        }

	        return inserido;
	    }

	    public void addRecategoriad(String categoria, String descricao) throws SQLException {
	        atualiza   = "INSERT INTO categorias (categoriaID, categoria, descricao) VALUES (null, '" + categoria + "', '" + descricao + "')";
	        declaracao = conexao.createStatement();
	        int resultado = declaracao.executeUpdate(atualiza);
	        declaracao.close();
	    }

	    public void delRecategoriad(int categoriaID) throws SQLException {
	        atualiza   = "DELETE FROM categorias  WHERE categoriaID = '" + categoriaID + "'";
	        declaracao = conexao.createStatement();

	        int resultado = declaracao.executeUpdate(atualiza);

	        declaracao.close();
	    }

	    public void updateRecategoriad(int categoriaID, String categoria, String descricao) throws SQLException {
	        atualiza = "UPDATE categorias  SET categoria = '" + categoria + "', descricao = '" + descricao + "' WHERE categoriaID = '" + categoriaID
	                   + "'";
	        declaracao = conexao.createStatement();

	        int resultado = 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 (SQLException e) {
            System.out.println("Não foi possivel getTodos()  classe categorias");
        }
                   ///Incluir o fechar stantement
        declaracao.close();
        return resultado;
    }


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

Para usar jdbc vc basicamente faz assim:

  1. abra conexão
  2. crie statement a partir da conexão
  3. execute consultas que retornem (ou não) um ResultSet
    
  4. trate o seu ResultSet transforme-o em algo que você vá usar como uma lista de objetos, sei lá.
    
  5. feche o resultset
    
  6. feche o statement
  7. 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:

  1. abra conexão
  2. crie statement a partir da conexão
  3. execute consultas que retornem (ou não) um ResultSet
    
  4. trate o seu ResultSet transforme-o em algo que você vá usar como uma lista de objetos, sei lá.
    
  5. feche o resultset
    
  6. feche o statement
  7. 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.

if (resultado.next()) { 
----&gt;resultado.beforeFirst(); 
} else { 
resultado = null; 
declaracao.close(); 
}
Criado 29 de julho de 2010
Ultima resposta 30 de jul. de 2010
Respostas 4
Participantes 2