2013-01-31 20 views
1

我有一個與使用JPA的SQL查詢性能相關的問題。Hibernate,用參數查詢SQL。性能不佳

響應時間:

  • 使用蟾蜍 - 200毫秒
  • 內使用Glassfish的2.1,Java 1.5中我的項目,休眠3.4.0.ga - 27號

Oracle 10g

玻璃魚和蟾蜍在同一臺機器上託管。我已經連接到來自相同Glassfish,JPA等的其他ddbb,並且性能很好。所以我不知道發生了什麼。

我有兩個不同的環境。在其中一個(理論上最糟糕的是)它運行得很快。另一方面,這是我遇到問題的地方。

該查詢是通過Javax.persistence.Query對象執行的,並且在此對象中插入參數的方法爲setParameter()。之後,我調用getResultList()方法,並且此方法將寄存器返回給我。在這一點上是時間過度的地方。

但是,如果我替換代碼中的參數,並且直接調用getResultList()方法,而無需將參數設置爲Query對象,則性能會更好。

任何人都可以幫助我解決問題或如何追蹤它?

查詢

SELECT A, B, ..., DATE_FIELD FROM 
    (SELECT A, B, C FROM Table1 
     WHERE REGEXP_LIKE(A, NVL(UPPER(:A),'')) AND DATE_FIELD = :DATE 
     UNION 
     SELECT A, B, C FROM Table2 
     WHERE REGEXP_LIKE(A, NVL(UPPER(:A),'')) AND DATE_FIELD = :DATE) 

Java代碼的

public Query generateQuerySQL(String stringQuery, HashMap<String, Object> hParams) { 
    Query query = em.createNativeQuery(stringQuery); 
    if (hParams != null) { 
     for (Iterator<String> paramNameList = hParams.keySet().iterator(); paramNameList.hasNext() { 
      String name = paramNameList.next(); 
      Object value = hParams.get(name); 
      query.setParameter(name, value); 
      } 
     } 
    return query; 
    } 
+0

唯一可能性是數據集或查詢緩存配置中的數據庫的大小。 – Phani

+0

請顯示真實的代碼示例。實體,JPA查詢,e.t.c. – Taky

+0

@Taky,現在你可以看到查詢和Java代碼。 –

回答

2

Query query = em.createNativeQuery(stringQuery);

將闡述查詢計劃執行查詢。不幸的是,用於詳細說明查詢計劃的元數據不適合執行查詢時將使用的實際參數值。

如果您在闡述計劃之前替換參數:計劃很好,運行速度非常快。

類似的問題here

+1

我已經使用參數進行了測試並避免了DATE類型,並且性能很好。我認爲問題來自Date參數。謝謝 –