Minha aplicação esta pesada! ajuda

Ola pessoal…

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?

muito obrigado!

“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.

está usando pool de conexões?

entao…

esse é o maior problema… Todas as minha entidades foram geradas pelo netbeans com JPA.

“select nome from Cliente” (consulta tosca) :stuck_out_tongue:

devo confiar nessas configurações?

esse ai é meu superDao


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.

eae

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.

[]s
Ferry

Cara vai com calma, pera ai…
Primeiro lugar, tu tem que definir o que de performance tu quer ganhar. Senão vai ficar nadando contra a maré.

Você acha 3 segundos muito ? Qual o resultado esperado ?

Qual o seu cenário ? (Você pode estar consultando em uma tabela com 50.000.000 de registros e retornando 27)

O problema está mesmo na query ?

Primeiro mire e depois atire, descubra qual o seu problema especifico e depois tente resolve-lo e não o contrário.

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.

só depois disso eu veria código:

  • vc está usando o pool?
  • fetch

Faz a seguinte alteração e posta o resultado:

[code]

public abstract class SuperDao {

protected static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("DeskClinPersistence");
protected EntityManager em = null;

public SuperDao() {
    em = emf.createEntityManager();
}

[…][/code]

ola colegas!

no banco é tranquilo!

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 …)

valeu