Olá,
estou encerrando o desenvolvimento da aplicação para o meu TCC, são duas aplicações, uma delas é praticamente um CRUD Java + Hibernate + Mysql, o problema é que quando eu populo o banco de dados dessa aplicação com por exemplo 100.00 registros, a mesma fica extremamente lenta, até mesmo em tabelas que contenham por exemplo apenas 2 tuplas, chegando a demorar minutos só para realizar um login, mesmo que eu tenha apenas um usuário cadastrado na tabela de usuários.
Também tenho uma outra aplicação aqui que já deve ter uns 3.000 registros e estou notando que ela já está começando a ficar consideravelmente lenta.
Quando faço uma consulta qualquer através do netbeans, mesmo no bd com 100.00 registros o resultado é instantâneo, mas na minha aplicação demora muito tempo.
Vou deixar aqui os arquivos de configuração do hibernate e a minha classe DAO abstrata para que vocês possam me ajudar a encontrar o erro, porém, caso alguém esteja interessado em ver alguma outra parte do código para poder detectar o erro eu posso postar com prazer.
Conto com a ajuda de vocês, obrigado.
HIBERNATE.CFG.XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/smid_server</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.show_sql">false</property>
<mapping resource="persistencia/hibernate/mapeamentos/Municipio.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Imovel.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Visitapesquisa.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Quadra.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Agente.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Boletimtratamento.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Logradouro.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Permissao.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Visitatratamento.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Boletimpesquisa.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Localidade.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Transacaoagente.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Acessos.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Quadralogradouro.hbm.xml"/>
<mapping resource="persistencia/hibernate/mapeamentos/Configuracao.hbm.xml"/>
</session-factory>
</hibernate-configuration>
ABSTRACTDAO.JAVA
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package persistencia.dao;
import java.util.ArrayList;
import persistencia.session.hibernateSessionFactory;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;
/**
*
* @author Maycon Fernando Silva Brito @email mayconfsbrito@gmail.com
*/
public class AbstractDAO {
protected static Session sessao;
protected static Transaction transacao = null;
/**
* Inicializa a sessao para efetuar as transacoes no banco de dados
*/
public static final void inicializaSessao() {
sessao = hibernateSessionFactory.getSession();
}
/**
* Fecha a sessao caso ela esteja aberta
*/
public static boolean fechaSessao() {
if (sessao.isOpen()) {
sessao.flush();
sessao.close();
return true;
}
return false;
}
/**
* Cadastra um unico objeto no banco de dados
*
* @param obj - Objetto a ser cadastrado
* @return - @true se o objeto foi cadastrado, @false se o objeto nao foi
* cadastrado
*/
public static boolean cadastrar(Object obj) {
try {
inicializaSessao();
transacao = sessao.beginTransaction();
sessao.merge(obj);
transacao.commit();
return true;
} catch (HibernateException er) {
er.printStackTrace();
transacao.rollback();
return false;
} finally {
fechaSessao();
}
}
/**
* Altera um unico objeto no banco de dados
*
* @param obj - Objetto a ser alterado
* @return - @true se o objeto foi alterado, @false se o objeto nao foi
* alterado
*/
public static boolean alterar(Object obj) {
try {
inicializaSessao();
transacao = sessao.beginTransaction();
sessao.merge(obj);
transacao.commit();
return true;
} catch (HibernateException er) {
er.printStackTrace();
transacao.rollback();
return false;
} finally {
fechaSessao();
}
}
/**
* Exclui um unico objeto no banco de dados
*
* @param obj - Objeto a ser excluido
* @return - @true se o objeto foi excluido, @false se o objeto nao foi
* excluido
*/
public static boolean excluir(Object obj) {
try {
inicializaSessao();
transacao = sessao.beginTransaction();
sessao.delete(obj);
transacao.commit();
return true;
} catch (HibernateException er) {
er.printStackTrace();
transacao.rollback();
return false;
} finally {
fechaSessao();
}
}
/**
* Esclui um determinado objeto a partir unicamente do seu id
*
* @param nomeObjeto
* @param nomeId
* @param id
* @return
*/
public static boolean excluirPorId(String nomeObjeto, String nomeId, Integer id) {
try {
List obj = consultar(nomeObjeto, "" + nomeId + "=" + id);
Object objeto = obj.get(0);
if (!excluir(objeto)) {
System.out.println("Não foi possível excluir o objeto " + nomeObjeto + " de Id " + id);
}
return true;
} catch (IndexOutOfBoundsException er) {
return true;
} catch (Exception er) {
er.printStackTrace();
return false;
}
}
/**
* Consulta todos as instancias de um determinado objeto
*
* @param nomeObjeto - Nome dos objetos a serem consultados no banco de
* dados
* @return - Lista preenchida com as instancias do objeto no banco de dados,
* @null caso exista alguma excecao
*/
public static List listar(String nomeObjeto) {
try {
inicializaSessao();
transacao = sessao.beginTransaction();
List list = sessao.createQuery("from " + nomeObjeto).list();
return list;
} catch (HibernateException er) {
er.printStackTrace();
return null;
} finally {
fechaSessao();
}
}
/**
* Consulta um tipo de objetos do banco de dados a partir de uma determinada
* condicao
*
* @param nomeObjeto - Nome dos objetos a serem consultados no banco de
* dados
* @param condicao - Condicao a ser satisfeita para realizar a consulta
* @return - Lista preenchida com os objetos que satisfazem a condicao
*/
public static List consultar(String nomeObjeto, String condicao) {
try {
inicializaSessao();
transacao = sessao.beginTransaction();
List list = sessao.createQuery("from " + nomeObjeto + " where " + condicao).list();
return list;
} catch (Exception er) {
er.printStackTrace();
return null;
} finally {
fechaSessao();
}
}
/**
* Realiza uma consulta puramente através do HQL
*
* @return
*/
public static List consultar(String hql) {
try {
inicializaSessao();
transacao = sessao.beginTransaction();
List list = sessao.createQuery(hql).list();
return list;
} catch (Exception er) {
er.printStackTrace();
return null;
} finally {
fechaSessao();
}
}
/**
* Realiza uma listagem sem fechar a sessao
*
* @param nomeObjeto
* @return
*/
public static List listarSemFecharSessao(String nomeObjeto) {
try {
inicializaSessao();
transacao = sessao.beginTransaction();
List list = sessao.createQuery("from " + nomeObjeto).list();
return list;
} catch (Exception er) {
er.printStackTrace();
return null;
}
}
/**
* Realiza uma consulta sem fechar a sessao
*
* @param nomeObjeto
* @param condicao
* @return
*/
public static List consultarSemFecharSessao(String nomeObjeto, String condicao) {
try {
List list = null;
inicializaSessao();
transacao = sessao.beginTransaction();
if (nomeObjeto != null) {
list = sessao.createQuery("from " + nomeObjeto + " where " + condicao).list();
} else {
list = sessao.createQuery(condicao).list();
}
return list;
} catch (Exception er) {
er.printStackTrace();
return null;
}
}
/**
* Inicializa um jComboBox com todos os objetos de uma tabela ordenados
*/
public static DefaultComboBoxModel inicializaComboBoxEntidades(String primeiraPosicao, String nomeTabela, String atributoOrdenado) {
try {
List<String> list = new ArrayList<String>();
inicializaSessao();
list = sessao.createQuery("select nome from " + nomeTabela + " order by " + atributoOrdenado).list();
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement(primeiraPosicao);
for (int i = 0; i < list.size(); i++) {
model.addElement(list.get(i));
}
return model;
} catch (HibernateException er) {
JOptionPane.showMessageDialog(null, "Não foi possível carregar o ComboBox.", "Erro", JOptionPane.ERROR_MESSAGE);
er.printStackTrace();
return null;
} finally {
fechaSessao();
}
}
/**
* Inicializa um jComboBox com todos os objetos de uma tabela ordenados
*/
public static DefaultComboBoxModel inicializaComboBoxGenerico(String primeiraPosicao, String select, String nomeTabela, String atributoOrdenado) {
try {
List<String> list = new ArrayList<String>();
inicializaSessao();
list = sessao.createQuery("select " + select + " from " + nomeTabela + " order by " + atributoOrdenado).list();
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement(primeiraPosicao);
for (int i = 0; i < list.size(); i++) {
model.addElement(list.get(i));
}
return model;
} catch (HibernateException er) {
JOptionPane.showMessageDialog(null, "Não foi possível carregar o ComboBox.", "Erro", JOptionPane.ERROR_MESSAGE);
er.printStackTrace();
return null;
} finally {
fechaSessao();
}
}
/**
* Realiza a contagem de objetos na tabela
*
* @param nomeObjeto
* @return
*/
public static int count(Class classe) {
try {
inicializaSessao();
Criteria criteria = sessao.createCriteria(classe);
criteria.setProjection(Projections.rowCount());
return ((Integer) criteria.list().get(0)).intValue();
} catch (Exception er) {
er.printStackTrace();
transacao.rollback();
return -1;
} finally {
sessao.flush();
sessao.close();
}
}
/**
* Verifica qual o maior valor do atributo da classe no bd
*
* @param nomeObjeto
* @return
*/
public static int max(Class classe, String atributo) {
try {
inicializaSessao();
Criteria criteria = sessao.createCriteria(classe);
criteria.setProjection(Projections.max(atributo));
if (((Integer) criteria.list().get(0)) != null) {
return ((Integer) criteria.list().get(0)).intValue();
} else {
return 1;
}
} catch (Exception er) {
er.printStackTrace();
transacao.rollback();
return -1;
} finally {
sessao.flush();
sessao.close();
}
}
public static Session getSession() {
return sessao;
}
}