簡體   English   中英

創建JPA本機查詢很慢

[英]Creating JPA Native Query is slow

  • 資料庫:MySQL 5.1
  • JPA實現:EclipseLink
  • 容器:玻璃魚4
  • Java:JDK 7u55

我使用本機查詢從訂單表中獲取結果。 每個訂單都有一個日期,我只想按年份和日期選擇。 整個方法都有這個主體。

    Query query = entityManager.createNativeQuery("SELECT COUNT(PLACED_ORDER.ID) as POCET_OBJEDNAVEK FROM PLACED_ORDER WHERE ORDERDATE IS NOT NULL AND EXTRACT(YEAR FROM ORDERDATE) = ?1 AND extract(DAY FROM ORDERDATE) = ?2");
    query.setParameter(1, year);
    query.setParameter(2, day);

    return (Long) query.getSingleResult();

此查詢工作正常,但執行速度很慢。 慢一點,我的意思是每個方法調用都需要一秒鍾或更長時間。 事務管理已設置為“必需”。

從請求到響應,命名查詢將在幾毫秒內執行。 單獨調用此方法非常慢。 有什么可以解決的嗎?

編輯-對評論的反應:

當我從命令行或通過MySQL WorkBench查詢數據庫時,性能是正常的(在重負載下最多為一毫秒或幾毫秒)。

我還應該提及在該項目上禁用SECOND LEVEL CACHE ,對此我無能為力。

MySQL Explain看起來像這樣(沒有簡單的方法讓我在EclipseLink上啟用解釋)。

在此處輸入圖片說明

實體批注,用於確定數據類型和數據庫約束。

@Entity(name = "PLACED_ORDER")
public class Order implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
@JoinColumn(name = "CUSTOMER_ID")
private Customer customer;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REMOVE, CascadeType.PERSIST}, orphanRemoval = true)
@JoinColumn(name = "PLACED_ORDER_ID")
private List<OrderItem> items;
@Temporal(TemporalType.TIMESTAMP)
private Date orderDate;
@Enumerated(EnumType.STRING)
@NotNull
private OrderState orderState = OrderState.SEMIFINISHED;
@OneToOne
private Transportation transportation;
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval = true)
private Address deliveryAddress;
@Enumerated(EnumType.STRING)
private TransportationType transportationType;

在問題中指定的技術和二級緩存被禁用的情況下,解決方案是將本機查詢編寫為@NamedNativeQuery ,而不是每次調用方法時都創建它。 這樣,性能顯着提高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM