Witam,
moje pytanie zwiazane jest z optymlizacja czasu zapytania w EJB.
Korzystam z servera Jboss 5.0.1GA oraz bazy testowej "Northwind" postawionej na MySQL 5.1.
Testuje 2 zapytania:
1)SELECT c FROM Customers c where c.companyName = 'xxx'
2)SELECT DISTINCT c.companyName FROM Customers c join c.orders o join o.orderDetails od WHERE od.quantity > 12
Zapytanie 1 zwraca 1 wiersz, 2 - 80.Obydwa są zdefiniowane jako named queries w klasie encji Customers.
Problem tkwi w tym, że średni czas wykonania 1 zapytania to ok 5 sek a drugiego w granicach 500 milisekund.Czsy obydwu zapytan powinny wynosic w zalozeniu ok 500 milisekund.
Implementacja procedury ktora wywołuje zapytania jest taka sama.
Fragment encji która zawiera zdefiniowane Named Queries :
public class Customers implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "CustomerID")
private String customerID;
@Basic(optional = false)
@Column(name = "CompanyName")
private String companyName;
@Column(name = "ContactName")
private String contactName;
@Column(name = "ContactTitle")
private String contactTitle;
@Column(name = "Address")
private String address;
@Column(name = "City")
private String city;
@Column(name = "Region")
private String region;
@Column(name = "PostalCode")
private String postalCode;
@Column(name = "Country")
private String country;
@Column(name = "Phone")
private String phone;
@Column(name = "Fax")
private String fax;
//bi-directional many-to-many association to Customerdemographic
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(
name="customercustomerdemo"
, joinColumns={
@JoinColumn(name="CustomerID", referencedColumnName="CustomerID", nullable=false)
}
, inverseJoinColumns={
@JoinColumn(name="CustomerTypeID", referencedColumnName="CustomerTypeID", nullable=false)
}
)
private java.util.Set<Customerdemographics> customerdemographics;
//bi-directional many-to-one association to Order
@OneToMany(mappedBy="customerss", fetch=FetchType.LAZY)
private java.util.Set<Orders> orders;
public java.util.Set<Customerdemographics> getCustomerdemographics() {
return this.customerdemographics;
}
public void setCustomerdemographics(java.util.Set<Customerdemographics> customerdemographicss) {
this.customerdemographics = customerdemographicss;
}
public java.util.Set<Orders> getOrders() {
return this.orders;
}
public void setOrders(java.util.Set<Orders> orderss) {
this.orders = orderss;
}
Fragment fasady:
public List<Customers> Query1() {
Query q = em.createNamedQuery("Customers.Query1");
return q.getResultList();
}
public List<Customers> Query2() {
Query q = em.createNamedQuery("Customers.Query2");
return q.getResultList();
}
Wiec pobieram w obydwu przypadkach liste encji.
Korzystam przy tym z interfejsów zarówno Lokalnego(w kontenerze) jak i Remote(w standalone)
wydaje mi się że problem jest gdzieś w ustawieniach JBossa natomiast nie potrafie go zlokalizowac:(
Korzystam z local-tx-datasource w tym wypadku,nie wiem co jeszcze może byc istotne,może ktoś z was bedzie wiedział co może byc przyczyna??