提问者:小点点

Hibernate,使用参数查询SQL。糟糕的表现


我有一个与使用 JPA 的 SQL 查询性能相关的问题。

响应时间:

    < li >使用Toad - 200 ms < li >在我的项目中使用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;
   }

共2个答案

匿名用户

查询查询=em.createNativeQuery(stringQuery);

将详细说明执行查询的查询计划。遗憾的是,用于详细说明查询计划的元数据不符合执行查询时将使用的实际参数值。

如果在制定计划之前替换参数:计划很好,运行速度很快。

类似的问题在这里

匿名用户

您应该在 Oracle 中更改 cursor_sharing = FORCE,以在 JPA 中启用 Oracle 的Hibernate支持。

有关详细信息,请参阅以下内容