簡體   English   中英

休眠,使用參數查詢 SQL。 表現不佳

[英]Hibernate, Query SQL with params. Bad Performance

我有一個與使用 JPA 的 SQL 查詢的性能相關的問題。

響應時間:

  • 使用 Toad - 200 毫秒
  • 在我的項目中使用Glassfish 2.1、Java 1.5、Hibernate 3.4.0.ga - 27 s

甲骨文 10g

Glassfish 和 Toad 托管在同一台機器上。 我已經從同一個 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;
   }

Query query = em.createNativeQuery(stringQuery);

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

如果在制定計划之前替換參數:計划很好並且運行速度非常快。

類似的問題在這里

您應該在 oracle 中更改cursor_sharing = FORCE以在 JPA 中為 oracle 啟用休眠支持。

請參閱以下了解更多詳情

暫無
暫無

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

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