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

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

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!

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.

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