Re: JPA slow on remote database queryes
Thank you Lew for your exaustive answer, but I've got this performance
problem and I need to solve it. I hope you can help me finding a
reasonable solution. I'm happy that you can load thousands of records
with JPA, so I hope I can load them so fast too.. However, locally, in
my local area network, I can load thousands of records with JPA too..
the performance problem begins when I try to load data from a remote
host database.
To be clear, here is my JPA query and my entity code:
//query
String query = "SELECT a FROM Articoli a";
Query q = entityManager.createQuery(query);
java.util.Collection data = q.getResultList();
for (Object entity : data) {
entityManager.refresh(entity);
}
list.clear();
list.addAll(data);
//entity, Articoli.java
@Entity
@Table(name = "articoli")
@NamedQueries({
..here are NamedQueries for each field..
})
public class Articoli implements Serializable {
@Transient
private PropertyChangeSupport changeSupport = new
PropertyChangeSupport(this);
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "CodiceArticolo")
private Integer codiceArticolo;
@Basic(optional = false)
@Column(name = "Descrizione")
private String descrizione;
@Column(name = "H")
private BigDecimal h;
@Column(name = "L")
private BigDecimal l;
@Column(name = "Diametro")
private BigDecimal diametro;
@Column(name = "Spessore")
private BigDecimal spessore;
@Basic(optional = false)
@Column(name = "prezzo")
private BigDecimal prezzo;
@Column(name = "Lungh")
private BigDecimal lungh;
@Column(name = "Peso")
private BigDecimal peso;
@Column(name = "Lung_scatola")
private BigDecimal lungscatola;
@Column(name = "Larg_scatola")
private BigDecimal largscatola;
@Column(name = "H_scatola")
private BigDecimal hscatola;
@Column(name = "Peso_scatola")
private BigDecimal pesoscatola;
@Column(name = "Spessore_max")
private BigDecimal spessoremax;
@Column(name = "Lampada")
private String lampada;
@Column(name = "Watt")
private BigDecimal watt;
@Column(name = "Lumen")
private BigDecimal lumen;
@Column(name = "Temp_colore")
private BigDecimal tempcolore;
@Column(name = "Trattamento")
private String trattamento;
@Column(name = "T_50_min")
private BigDecimal t50min;
@Column(name = "T_50_max")
private BigDecimal t50max;
@Column(name = "Id")
private BigDecimal id;
@Column(name = "Od")
private BigDecimal od;
@Version
protected int version;
@JoinColumn(name = "CodiceSezione", referencedColumnName =
"codice")
@ManyToOne
private Sezione codiceSezione;
@JoinColumn(name = "CodiceCategoria1", referencedColumnName =
"codice")
@ManyToOne
private Categoria codiceCategoria1;
@JoinColumn(name = "CodiceCategoria2", referencedColumnName =
"codice")
@ManyToOne
private Categoria codiceCategoria2;
@JoinColumn(name = "CodiceCategoria3", referencedColumnName =
"codice")
@ManyToOne
private Categoria codiceCategoria3;
@JoinColumn(name = "CodiceCategoria4", referencedColumnName =
"codice")
@ManyToOne
private Categoria codiceCategoria4;
@OneToMany(cascade = CascadeType.ALL, mappedBy =
"codicearticolomagaz")
private Collection<Magazzinodettaglio>
magazzinodettaglioCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy =
"codicearticolofornitore")
private Collection<Articolifornitori> articolifornitoriCollection;
public Articoli() {
}
public Articoli(Integer codiceArticolo) {
this.codiceArticolo = codiceArticolo;
}
public Articoli(Integer codiceArticolo, String descrizione,
BigDecimal prezzo) {
this.codiceArticolo = codiceArticolo;
this.descrizione = descrizione;
this.prezzo = prezzo;
}
..here are getter/setter methods for each field..
public Collection<Magazzinodettaglio>
getMagazzinodettaglioCollection() {
return magazzinodettaglioCollection;
}
public void
setMagazzinodettaglioCollection(Collection<Magazzinodettaglio>
magazzinodettaglioCollection) {
this.magazzinodettaglioCollection =
magazzinodettaglioCollection;
}
public Collection<Articolifornitori>
getArticolifornitoriCollection() {
return articolifornitoriCollection;
}
public void
setArticolifornitoriCollection(Collection<Articolifornitori>
articolifornitoriCollection) {
this.articolifornitoriCollection =
articolifornitoriCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (codiceArticolo != null ? codiceArticolo.hashCode() :
0);
return hash;
}
@Override
public boolean equals(Object object) {
if (!(object instanceof Articoli)) {
return false;
}
Articoli other = (Articoli) object;
if ((this.codiceArticolo == null && other.codiceArticolo !=
null) || (this.codiceArticolo != null && !
this.codiceArticolo.equals(other.codiceArticolo))) {
return false;
}
return true;
}
@Override
public String toString() {
return "desktopapplication1.Articoli[codiceArticolo=" +
codiceArticolo + "]";
}
public void addPropertyChangeListener(PropertyChangeListener
listener) {
changeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener
listener) {
changeSupport.removePropertyChangeListener(listener);
}
}
If it's not enough, please let me know, and I'll prepare a sample
application.
I hope you can help me to achive a better performance.
Thank you very much in advance for your help guys!