Fórum Hibernate Lento #5414

07/05/2009

0

Achei muito demorada as consultas usando o JPA & hibernate, comparando com SQL puro importando uma lista de dados para uma jtable, a diferença é enorme, a pergunta é a seguinte, tem como deixar mais rapido ou alguma configuração no persistence.xml que possa resolver isso?????
Pirahy Alimentos

Pirahy Alimentos

Responder

Posts

07/05/2009

Dyego Carmo

Gostaria de algumas informações:

1 - Cole a CLASSE JAVA que você esta utilizando como POJO
2 - Me diga qual o SQL que você está utilizando para fazer a pesquisa


Valeu !
Responder

Gostei + 0

07/05/2009

Pirahy Alimentos

Vou colar a classe que consulta, a classe com os dados da tabela, e a configuração do persitence,xml -------------------------- CLASSE -------------------------- package br.com.erp.jpaLig; import java.text.MessageFormat; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; /** * * @author Joao Rocha */ public class RamalTela extends javax.swing.JFrame { DefaultTableModel tmLista = new DefaultTableModel(null, new String[]{"Código", "Nome"}); protected String[] columnToolTips = { null, // "First Name" assumed obvious null, // "Last Name" assumed obvious "The person's favorite sport to participate in", "The number of years the person has played the sport", "If checked, the person eats no meat"}; ListSelectionModel lsmLista; List lista; String tipoCadastro; private Ramal ramal; List grupos; List deptos; EntityManager em; private EntityManagerFactory emf; /** Creates new form Origemes */ public RamalTela() { initComponents(); emf = Persistence.createEntityManagerFactory("PgLigHI"); em = emf.createEntityManager(); DefaultTableCellRenderer direita = new DefaultTableCellRenderer(); direita.setHorizontalAlignment(SwingConstants.RIGHT); tbLista.getColumnModel().getColumn(0).setPreferredWidth(10); tbLista.getColumnModel().getColumn(1).setPreferredWidth(200); tbLista.setAutoCreateRowSorter(true); // tbLista.setBackground(Color.GRAY); tbLista.setOpaque(true); em.getTransaction().begin(); Query lt = em.createNamedQuery("Grupo.findAll"); lt.setParameter("findDesc", "%%"); grupos = lt.getResultList(); cbGrupo.removeAllItems(); for (int i = 0; i < grupos.size(); i++) { cbGrupo.addItem(grupos.get(i).getDescr()); } em.getTransaction().commit(); em.getTransaction().begin(); lt = em.createNamedQuery("Depto.findAll"); lt.setParameter("findDesc", "%%"); deptos = lt.getResultList(); cbDepto.removeAllItems(); for (int i = 0; i < deptos.size(); i++) { cbDepto.addItem(deptos.get(i).getDescr()); } em.getTransaction().commit(); listarReg(); } ////////////////////////////////////////////////////////////////////////// private void btCancelarActionPerformed(java.awt.event.ActionEvent evt) { desabilitarCampos(); } private void alteraOrigem() { if (tbLista.getSelectedRow() != -1) { habilitarCampos(); } else { JOptionPane.showMessageDialog(this, "Selecione um registro!"); } } protected boolean verificarLogin() { if (tfCodigo.getText().length() > 10) { return false; } return true; } protected void alterarOrigem() { try { if (verificarCampos() && verificarLogin()) { em.getTransaction().begin(); int i = tbLista.convertRowIndexToModel(tbLista.getSelectedRow()); ramal = em.find(Ramal.class, lista.get(i).getId()); ramal.setId(Integer.parseInt(tfCodigo.getText().trim())); ramal.setDesc(tfNome.getText().trim()); ramal.setGrupo(grupos.get(cbGrupo.getSelectedIndex())); ramal.setDepto(deptos.get(cbDepto.getSelectedIndex())); em.persist(ramal); em.getTransaction().commit(); desabilitarCampos(); listarReg(); } else { JOptionPane.showMessageDialog(this, "Informe o nome do registro!"); tfNome.requestFocus(); } } catch (NumberFormatException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(null, "Campo Com formato Invalido: " + ex); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(null, ex); } } private void btAlterarActionPerformed(java.awt.event.ActionEvent evt) { tipoCadastro = "alteracao"; alteraOrigem(); } private void btSalvarActionPerformed(java.awt.event.ActionEvent evt) { if (tipoCadastro.equals("novo")) { cadastraOrigem(); } else if (tipoCadastro.equals("alteracao")) { alterarOrigem(); } } protected void tbOrigemLinhaSelecionada(JTable tb) { desabilitarCampos(); try { if (tb.getSelectedRow() != -1) { int i = tb.convertRowIndexToModel(tb.getSelectedRow()); tfNome.setText(lista.get(i).getDesc()); tfCodigo.setText(lista.get(i).getId().toString()); try { selecionaGrupo(lista.get(i).getGrupo().getId()); } catch (Exception ex) { cbGrupo.setSelectedIndex(-1); } try { selecionaDepto(lista.get(i).getDepto().getId()); } catch (Exception ex) { cbDepto.setSelectedIndex(-1); } } else { tfNome.setText(""); tfCodigo.setText(""); } } catch (Exception ex) { ex.printStackTrace(); // JOptionPane.showMessageDialog(null, ex); } } private void selecionaGrupo(int codigo) { for (int i = 0; i < grupos.size(); i++) { if (grupos.get(i).getId().equals(codigo)) { cbGrupo.setSelectedIndex(i); return; } } cbGrupo.setSelectedIndex(-1); } private void selecionaDepto(int codigo) { for (int i = 0; i < deptos.size(); i++) { if (deptos.get(i).getId().equals(codigo)) { cbDepto.setSelectedIndex(i); return; } } cbDepto.setSelectedIndex(-1); } private void novoOrigem() { habilitarCampos(); tfNome.setText(""); tfCodigo.setText(""); } protected void cadastraOrigem() { if (verificarCampos() && verificarLogin()) { em.getTransaction().begin(); ramal = new Ramal(); ramal.setId(Integer.parseInt(tfCodigo.getText().trim())); ramal.setDesc(tfNome.getText().trim()); ramal.setGrupo(grupos.get(cbGrupo.getSelectedIndex())); ramal.setDepto(deptos.get(cbDepto.getSelectedIndex())); em.persist(ramal); em.getTransaction().commit(); desabilitarCampos(); } } protected boolean verificarCampos() { if (!tfNome.getText().trim().equals("")) { return true; } return false; } private void habilitarCampos() { tfNome.setEditable(true); tfCodigo.setEditable(true); cbDepto.setEnabled(true); cbGrupo.setEnabled(true); btSalvar.setEnabled(true); } protected void desabilitarCampos() { tfNome.setEditable(false); tfCodigo.setEditable(false); cbDepto.setEnabled(false); cbGrupo.setEnabled(false); btSalvar.setEnabled(false); } private void btNovoActionPerformed(java.awt.event.ActionEvent evt) { tipoCadastro = "novo"; novoOrigem(); } protected void listarReg() { em.getTransaction().begin(); Query lt = em.createNamedQuery("Ramal.findAll"); lt.setParameter("findDesc", "%" + tfPesquisa.getText().trim() + "%"); lista = lt.getResultList(); for (Object entity : lista) { em.refresh(entity); } em.getTransaction().commit(); mostrarOrigem(lista); } protected void mostrarOrigem(List listReg) { while (tmLista.getRowCount() > 0) { tmLista.removeRow(0); } if (listReg.size() == 0) { JOptionPane.showMessageDialog(this, "Nenhum Registro Encontrado!"); } else { String[] campos = new String[]{null, null, null, null}; for (int i = 0; i < listReg.size(); i++) { tmLista.addRow(campos); tmLista.setValueAt(listReg.get(i).getId(), i, 0); tmLista.setValueAt(listReg.get(i).getDesc(), i, 1); } } } private void btPesquisaActionPerformed(java.awt.event.ActionEvent evt) { listarReg(); } private void btImprimirActionPerformed(java.awt.event.ActionEvent evt) { MessageFormat header = new MessageFormat("Pagina {0,number,integer}"); try { tbLista.print(JTable.PrintMode.FIT_WIDTH, header, null); } catch (java.awt.print.PrinterException e) { System.err.format("Cannot print %s%n", e.getMessage()); } } private void formWindowClosed(java.awt.event.WindowEvent evt) { em.close(); } // Variables declaration - do not modify private javax.swing.JButton btAlterar; private javax.swing.JButton btCancelar; private javax.swing.JButton btImprimir; private javax.swing.JButton btNovo; private javax.swing.JButton btPesquisa; private javax.swing.JButton btSalvar; private javax.swing.JComboBox cbDepto; private javax.swing.JComboBox cbGrupo; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel8; private javax.swing.JScrollPane jScrollPane1; protected javax.swing.JTable tbLista; private javax.swing.JFormattedTextField tfCodigo; protected javax.swing.JTextField tfNome; protected javax.swing.JTextField tfPesquisa; // End of variables declaration } ------------------------------------------------------------------------- package br.com.erp.jpaLig; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Serializable; import java.util.List; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Transient; /** * * @author JoaoRocha */ @Entity @Table(name = "ramal", catalog = "\"PgLig\"", schema = "public") @NamedQueries({@NamedQuery(name = "Ramal.findAll", query = "SELECT r FROM Ramal r WHERE r.descr like :findDesc")}) public class Ramal implements Serializable { @Transient private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @Column(name = "id", nullable = false) private Integer id; @Column(name = "descr", length = 2147483647) private String descr; @JoinColumn(name = "depto", referencedColumnName = "id") @ManyToOne private Depto depto; @JoinColumn(name = "grupo", referencedColumnName = "id") @ManyToOne private Grupo grupo; @OneToMany(mappedBy = "ramal") private List usuarioCollection; @OneToMany(mappedBy = "ramal") private List ligacCollection; public Ramal() { } public Ramal(Integer id) { this.id = id; } public Integer getId() { return id; } public void setId(Integer id) { Integer oldId = this.id; this.id = id; changeSupport.firePropertyChange("id", oldId, id); } public String getDesc() { return descr; } public void setDesc(String desc) { String oldDesc = this.descr; this.descr = desc; changeSupport.firePropertyChange("descr", oldDesc, desc); } public Depto getDepto() { return depto; } public void setDepto(Depto depto) { Depto oldDepto = this.depto; this.depto = depto; changeSupport.firePropertyChange("depto", oldDepto, depto); } public Grupo getGrupo() { return grupo; } public void setGrupo(Grupo grupo) { Grupo oldGrupo = this.grupo; this.grupo = grupo; changeSupport.firePropertyChange("grupo", oldGrupo, grupo); } public List getUsuarioCollection() { return usuarioCollection; } public void setUsuarioCollection(List usuarioCollection) { this.usuarioCollection = usuarioCollection; } public List getLigacCollection() { return ligacCollection; } public void setLigacCollection(List ligacCollection) { this.ligacCollection = ligacCollection; } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Ramal)) { return false; } Ramal other = (Ramal) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "br.com.erp.jpaLig.Ramal[id=" + id + "]"; } public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } } ------------------------------------- Persistence--------------- org.hibernate.ejb.HibernatePersistence br.com.erp.jpaLig.Area br.com.erp.jpaLig.Depto br.com.erp.jpaLig.Grupo br.com.erp.jpaLig.Ligac br.com.erp.jpaLig.Ramal br.com.erp.jpaLig.Usuario
Responder

Gostei + 0

07/05/2009

Dyego Carmo

Olá

Poderia colar apenas o POJO ... não o FRAME... apenas a classe que vc retorna do banco de dados...

Valeu !

Responder

Gostei + 0

07/05/2009

Pirahy Alimentos

package br.com.erp.jpaLig; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Serializable; import java.util.List; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Transient; @Entity @Table(name = "ramal", catalog = "\"PgLig\"", schema = "public") @NamedQueries({@NamedQuery(name = "Ramal.findAll", query = "SELECT r FROM Ramal r WHERE r.descr like :findDesc")}) public class Ramal implements Serializable { @Transient private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @Column(name = "id", nullable = false) private Integer id; @Column(name = "descr", length = 2147483647) private String descr; @JoinColumn(name = "depto", referencedColumnName = "id") @ManyToOne private Depto depto; @JoinColumn(name = "grupo", referencedColumnName = "id") @ManyToOne private Grupo grupo; @OneToMany(mappedBy = "ramal") private List usuarioCollection; @OneToMany(mappedBy = "ramal") private List ligacCollection; public Ramal() { } public Ramal(Integer id) { this.id = id; } public Integer getId() { return id; } public void setId(Integer id) { Integer oldId = this.id; this.id = id; changeSupport.firePropertyChange("id", oldId, id); } public String getDesc() { return descr; } public void setDesc(String desc) { String oldDesc = this.descr; this.descr = desc; changeSupport.firePropertyChange("descr", oldDesc, desc); } public Depto getDepto() { return depto; } public void setDepto(Depto depto) { Depto oldDepto = this.depto; this.depto = depto; changeSupport.firePropertyChange("depto", oldDepto, depto); } public Grupo getGrupo() { return grupo; } public void setGrupo(Grupo grupo) { Grupo oldGrupo = this.grupo; this.grupo = grupo; changeSupport.firePropertyChange("grupo", oldGrupo, grupo); } public List getUsuarioCollection() { return usuarioCollection; } public void setUsuarioCollection(List usuarioCollection) { this.usuarioCollection = usuarioCollection; } public List getLigacCollection() { return ligacCollection; } public void setLigacCollection(List ligacCollection) { this.ligacCollection = ligacCollection; } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Ramal)) { return false; } Ramal other = (Ramal) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "br.com.erp.jpaLig.Ramal[id=" + id + "]"; } public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } }
Responder

Gostei + 0

07/05/2009

Dyego Carmo

Cole agora o comando HQL que vc esta utilizando para recuperar esta lista...

Cole tambem o comando SQL que você julgou estar mais rapido....


Responder

Gostei + 0

07/05/2009

Pirahy Alimentos

public List listarSetor(String nome){ List setor = new ArrayList(); try{ String consultaSetor = "SELECT * FROM \"USETOR\" WHERE \"SET_EMPRESA\" = ? AND \"SET_DESCRICAO\" LIKE ? ORDER BY \"SET_DESCRICAO\""; pstm = bd.conectar().prepareStatement(consultaSetor); pstm.setInt(1, PrinMenu.empresaSelecionada); pstm.setString(2, nome); rs = pstm.executeQuery(); SetorBean set; while (rs.next()){ set = new SetorBean(); set.setEmpresa(rs.getInt("SET_EMPRESA")); set.setCodigo(rs.getInt("SET_CODIGO")); set.setDescricao(rs.getString("SET_DESCRICAO")); set.setLocal(rs.getInt("SET_LOCAL")); set.setFator(rs.getInt("SET_FATOR_CONF")); set.setNum_rom(rs.getInt("SET_NUM_ROM")); set.setBloqueto(rs.getBoolean("SET_BLOQUETO")); setor.add(set); } bd.desconectar(); } catch(Exception e){ e.printStackTrace(); } return setor; } SÃO TABELAS DIFERENTES MAS COM O MESMO NUMERO DE REGISTRO, INDICES E TIPO DE TABELA ("CADASTRINHO") A RESPEITO DA DA CONSULTA EM JPA, EU USO NAMEQUERY....
Responder

Gostei + 0

07/05/2009

Pirahy Alimentos

AQUI TA A INSTRUÇÃO DO PREENCHIMENTO DA LISTA (JPA): //METODO DE PESQUISA protected void listarReg() { em.getTransaction().begin(); Query lt = em.createNamedQuery("Ramal.findAll"); lt.setParameter("findDesc", "%" + tfPesquisa.getText().trim() + "%"); lista = lt.getResultList(); for (Object entity : lista) { em.refresh(entity); } em.getTransaction().commit(); mostrarOrigem(lista); } //METODO DE PREENCHIMENTO DA LISTA protected void mostrarOrigem(List listReg) { while (tmLista.getRowCount() > 0) { tmLista.removeRow(0); } if (listReg.size() == 0) { JOptionPane.showMessageDialog(this, "Nenhum Registro Encontrado!"); } else { String[] campos = new String[]{null, null, null, null}; for (int i = 0; i < listReg.size(); i++) { tmLista.addRow(campos); tmLista.setValueAt(listReg.get(i).getId(), i, 0); tmLista.setValueAt(listReg.get(i).getDesc(), i, 1); } } }
Responder

Gostei + 0

07/05/2009

Dyego Carmo

Bom ,

Vamos por partes...

Primeiro... JPA faz bem mais que esse seu SELECT PURO...

JPA vai preencher Todos campos do seu POJO... inclusive aqueles que são classes... ex: se vc tem uma propriedade USUARIO ele vai dar um select com leftjoin no usuario e preencher...

Neste caso... se você não quer que ele preencha você tem DUAS saidas:

1 - Colocar no seu POJO nas propriedades que retornao algum tipo de classe não padrao do java a propriedade fetch=LAZY , assim não vai carregar automaticamente a cada select...


2 -  Fazer um HQL apenas nos campos que vc quer...
       select obj.campo1,obj.campo2 from obj where.... ae ele retorna um Object[][] (array bidimensional) , ou você pode estar retornando um objeto WRAPPER (em minhas video aulas aqui na devmedia ensino como criar um WRAPPER para hibernate )


Uma curiosidade... PARA QUE ess em.refresh ???? As operacoes com JPA que voces esta fazendo sao beeeeem maiores que com SQL... é claro qeu vai dar diferença !

Responder

Gostei + 0

07/05/2009

Pirahy Alimentos

Como coloquo essa propriedade fetsh=LASY???? AI VOU TESTAR SEM O REFRESH TB...
Responder

Gostei + 0

07/05/2009

Dyego Carmo

na definicao da coluna voce coloca mais uma opcao

fetch=FetchType.LAZY

ex:

@ManyToOne(fetch=FetchType.LAZY)
Responder

Gostei + 0

07/05/2009

Dyego Carmo

Chamado concluído ?
Responder

Gostei + 0

07/05/2009

Pirahy Alimentos

SIM, COMCLUIDO
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar