Hibernate Lento
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
Curtidas 0
Respostas
Dyego Carmo
07/05/2009
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 !
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 !
GOSTEI 0
Pirahy Alimentos
07/05/2009
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
GOSTEI 0
Dyego Carmo
07/05/2009
Olá
Poderia colar apenas o POJO ... não o FRAME... apenas a classe que vc retorna do banco de dados...
Valeu !
Poderia colar apenas o POJO ... não o FRAME... apenas a classe que vc retorna do banco de dados...
Valeu !
GOSTEI 0
Pirahy Alimentos
07/05/2009
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);
}
}
GOSTEI 0
Dyego Carmo
07/05/2009
Cole agora o comando HQL que vc esta utilizando para recuperar esta lista...
Cole tambem o comando SQL que você julgou estar mais rapido....
Cole tambem o comando SQL que você julgou estar mais rapido....
GOSTEI 0
Pirahy Alimentos
07/05/2009
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....
GOSTEI 0
Pirahy Alimentos
07/05/2009
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);
}
}
}
GOSTEI 0
Dyego Carmo
07/05/2009
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 !
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 !
GOSTEI 0
Pirahy Alimentos
07/05/2009
Como coloquo essa propriedade fetsh=LASY???? AI VOU TESTAR SEM O REFRESH TB...
GOSTEI 0
Dyego Carmo
07/05/2009
na definicao da coluna voce coloca mais uma opcao
fetch=FetchType.LAZY
ex:
@ManyToOne(fetch=FetchType.LAZY)
fetch=FetchType.LAZY
ex:
@ManyToOne(fetch=FetchType.LAZY)
GOSTEI 0
Dyego Carmo
07/05/2009
Chamado concluído ?
GOSTEI 0
Pirahy Alimentos
07/05/2009
SIM, COMCLUIDO
GOSTEI 0