Lentidão na comunicação com Banco de Dados [RESOLVIDO]

3 respostas
B

Caros amigos do fórum,

desculpem a mensagem enorme, mas não sei se tem outra forma decrever esse problema.

Estou fazendo um curso de Pós em analise de sistemas, e estou cursando uma cadeira de Java. Estou usando JDBC para fazer a comunicação com o banco de dados.

Não tenho muita experiência em Java, então aki vai o meu problema.

Estou fazendo um trabalho que é um caso de uso comum, com 2 campos na tabela, id e descrição. Então tenho que fazer o CRUD normal. Porem, tem algumas coisas estranhas acontecendo.

Estou usando umas classes que professor deu para fazer o acesso aos dados, um GenericDAO, e fiz o meu DAO baseado nesse. Nessas classes vc encontra: makePersistence, update… e por aí vai.

Seguindo as recomendações do professor, deixei a minha classe DAO como Singleton.

So que é o seguinte. As vezes, quando eu faço um acesso ao banco de dados via essa classe DAO tem vezes que é muito rápido, e outras que é extremamente lento, sem seguir nenhum padrão claro. Por exemplo. Tem um método nessa classe, findAll, pelo nome da para perceber que ele busca na tabela todos os registros e joga para um List.

Bem, tem horas que, quando eu chamo esse método vai rapidim, e outras que demora coisa de 10 segundos, e essa lentidão é aleatória. Eu abro o programinha que eu fiz, aí eu clico num botão, atualizar por exemplo, que chama esse método. Eu vou clicando repetidas vezes, e tem horas que é rápido e outras e lento.

E isso para todos os métodos desse classe, que faz, nada mais que, colocar o SQL dentro de um PreparedStatement, pega os dados em um ResultSet e depois percorre o mesmo para preencher a lista. Nada de mais.

Estou usando o PostgreSQL, e minha maquina tem 2gb de memória, maquina nova.

Não vou postar todas as classes aki, vou colocar so alguns métodos para vcs terem uma idéia:

GenericDAO

public abstract class GenericDAO<T, ID extends Serializable> implements IGenericDAO<T, ID> {

    private String driverClass;
    private String dbURL;
    private String user;
    private String passwd;
    protected Connection con = null;
    protected PreparedStatement ps;
    protected ResultSet rs;

    public GenericDAO() {
        try {
            SimpleDataSource.init("bd.properties");
            this.driverClass = SimpleDataSource.getDriver();
            this.dbURL = SimpleDataSource.getUrl();
            this.user = SimpleDataSource.getUsername();
            this.passwd = SimpleDataSource.getPassword();
        } catch (IOException ex) {
            Logger.getLogger(GenericDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(GenericDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void getConnection() throws DAOException {
        if (con != null) {
            return;
        }

        try {
            Class.forName(driverClass);
            con = DriverManager.getConnection(dbURL, user, passwd);
        } catch (ClassNotFoundException ex) {
            throw new DAOException("SQL exception in getConnection", ex);
        } catch (SQLException ex) {
            throw new DAOException("SQL exception in getConnection", ex);
        }
    }

    public void closeConnection() throws DAOException {
        try {
            if (con != null) {
                con.close();
            }
            con = null;
        } catch (SQLException ex) {
            throw new DAOException("SQL exception in closeConnection", ex);
        }
    }

    public void getPreparedStatement(String query) throws DAOException {
        try {
            getConnection();
            ps = con.prepareStatement(query);
        } catch (SQLException ex) {
            throw new DAOException("SQL exception in getPreparedStatement", ex);
        }
    }

    public void closePreparedStatement() throws DAOException {
        try {
            ps.close();
            closeConnection();
        } catch (SQLException ex) {
            throw new DAOException("SQL exception in closePreparedStatement", ex);
        }
    }
    
    protected abstract String getFindMaxQuery();

    public Long findMaxId() throws DAOException {
        Long maxId;
        try {
            getPreparedStatement(getFindMaxQuery());
            rs = ps.executeQuery();
            rs.next();
            maxId = rs.getLong("maxid");
            rs.close();

            closePreparedStatement();
        } catch (SQLException ex) {
            throw new DAOException("SQL exception in findId", ex);
        }

        return maxId;
    }
}

Um metodo da minha classe MotivoDesistenciaDAO

public List<MotivoDesistencia> findAll() throws DAOException {
        ArrayList<MotivoDesistencia> motivosDesistencia;
        
        System.out.println( "findAll" );
        
        try {
            getPreparedStatement(QUERY_SELECT_ALL);
            rs = ps.executeQuery();
            motivosDesistencia = new ArrayList<MotivoDesistencia>();
            while (rs.next()) {
                MotivoDesistencia motivo = new MotivoDesistencia();                               
                carregarDadosParaMotivoDesistencia( motivo, rs );
                
                motivosDesistencia.add(motivo);
            }
            rs.close();
        } catch (SQLException ex) {
            throw new DAOException("SQL exception in findAll", ex);
        } finally {
            closePreparedStatement();
        }
        System.out.println( "findAll*" );
        return motivosDesistencia;
    }

Obrigado a todos desde ja.
Se alguem tiver vendo algo errado ou tem alguma ideia, por favor, postem aí.

VLW

3 Respostas

Linkel

Fera, não analisei seu código…
Mas isso me parece configuração do PostgreSQL…
Está usando qual versão e em qual Sistema Operacional???
Já checou a abertura de conexões de rede nas configurações do PostgreSQL???
São especulações válidas…
Um abraço!

B

Po… o pior é que eu acho q matei a charada.

PO, estou usando o BitSpirit para baixar torrent. Eu nem percebi que ele tava ativo e baixando. Fui ver o consumo de memoria… tava ja no talo. Sem querer, eu fui navegar na net e vi que ele tava la, aí eu deu pausa nele e esqueci de dar o resume depois. Aì fui trabalhar no projeto e adivinhem !!!

Uma maravilha.

Aí dei resume no download e a aplicação que eu fiz fica lenta arrodo…

Vlw pela resposta Linkel.

Linkel

Blz, fera…
De qualquer forma, eram as conexões de rede, kkkkkkkk…
São detalhes minuciosos…
T+

Criado 28 de março de 2008
Ultima resposta 28 de mar. de 2008
Respostas 3
Participantes 2