Tenho uma superclasse DAO abstrata. Nela eu tenho alguns metodos abstratos e outros metodos concretos como por exemplo (Persiste e Remove). Nele tbm eu crio o EntityManagerFactory e o EntityManager no construtor (Estou utilizando Hibernate + JPA).
Todas as subclasses de SuperDao trabalham com esses metodos.
Só que ta qualquer consultinha tosca q eu faço ele demora em torno de uns 3 segundos entre abrir a janela e mostrar a lista dos dados em um combobox
Estou utilizando sql nativa e a consulta que faço é simples e tem somente 27 resultados… (O que poderia ser isso?)
alguem tem alguma sugestão de melhoria, ou de possiveis erros que eu possa estar cometendo com relação ao padrão DAO e a minha abstração?
“Qualquer consultinha tosca” leva quanto tempo para ser processada pelo seu banco de dados?
O primeiro lugar em que se pensa quando a aplicação está pesada é o que o seu banco de dados está fazendo.
Ele está indexado corretamente? Você usa os atributos corretos do Hibernate? e assim por diante.
public abstract class SuperDao {
protected EntityManagerFactory emf = null;
protected EntityManager em = null;
public SuperDao() {
emf = Persistence.createEntityManagerFactory("DeskClinPersistence");
em = emf.createEntityManager();
}
public abstract List listaTodos(String query);
public abstract Object buscarPorId(Integer id);
public abstract List<Object> listarPorString(Object obj, String str);
public void persiste(Object object) {
//emf = javax.persistence.Persistence.createEntityManagerFactory("DeskClinPersistence");
//em = emf.createEntityManager();
em.getTransaction().begin();
try {
em.persist(object);
em.getTransaction().commit();
} catch (Exception e) {
System.out.print(e.getMessage());
e.printStackTrace();
em.getTransaction().rollback();
} finally {
em.close();
}
}
}
ai eu tenho um cidadeDao que extend o superDao e trabalha sobre a entidade Cidade
@Entity
@Table(name = "cidade")
@NamedQueries({@NamedQuery(name = "Cidade.findByIdCidade", query = "SELECT c FROM Cidade c WHERE c.cidadePK.idCidade = :idCidade"), @NamedQuery(name = "Cidade.findByUFidUf", query = "SELECT c FROM Cidade c WHERE c.cidadePK.uFidUf = :uFidUf"), @NamedQuery(name = "Cidade.findByNome", query = "SELECT c FROM Cidade c WHERE c.nome = :nome")})
public class Cidade implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected CidadePK cidadePK;
@Column(name = "nome")
private String nome;
@Column(name = "distrito")
private String distrito;
@Column(name = "cep")
private String cep;
//get e set omitido :P
esse é o metodo de CidadeDao q eu uso para carregar as cidades em um List
public static final String listaCidadeNome ="Select cid.nome from Cidade cid";
@Override
public List<Cidade> listaTodos(String query) {
listaCidade = em.createQuery(query).getResultList();
em.close();
emf.close();
return listaCidade;
}
e esse é o codigo que eu uso para atribuir e carrgar a consulta na tela
public void carregarCidade(){
CidadeDao cidDao = new CidadeDao();
Iterator i = cidDao.listaTodos(CidadeDao.listaCidadeNome).iterator();
while (i.hasNext()) {
cCidade.addItem(String.valueOf(i.next()));
}
o que podem me dizer sobre isso?
desconfio do gerenciamento do EMF e do EM, mas nao sei como poderia melhorar.
Seu objeto cidade tem relação OneToMany com outros objetos e estão mapeados com fetch = EAGER ?
use o parametro showSQL true no persist.xml pra ver se ele não está consultando nada além do que deveria… se tiver, pode ser esse problema com os fetchs.
reforço o que o thingol já disse:
no banco essa consulta tosca demora quanto tempo?
normalmente deixamos qq tunning de aplicação para o final (precisamos primeiro entregar a aplicação né?) mas como vc já está achando lento acho que é o caso de ver o banco …
mais uma vez: Como está a performance do banco? só pra ter certeza de que seu problema não é o banco.
protected static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("DeskClinPersistence");
protected EntityManager em = null;
public SuperDao() {
em = emf.createEntityManager();
}
andei lendo algo sobre coleta de lixo e talls e ja deu pra perceber uma leve melhora, mais ainda assim esta pesado para um consulta que retorna todos os estados brasileiros…
quando abre a janela (JDialog), tbm é carregado esses estados no combobox e toda vez q eu inicio o programa pela primeira vez, tudo é mais demorado.
como vcs costumam fazer?
nesse mesmo padrão que estou fazendo, ou preferem algo mais manual (sem geração de entidade, JPA e …)