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