Hibernate,用params查询SQL。表现不佳

时间:2013-01-31 13:13:56

标签: performance oracle hibernate jpa glassfish

我遇到了与使用JPA的SQL查询性能相关的问题。

回应时间:

  • 使用Toad - 200 ms
  • 在我的项目中使用 Glassfish 2.1,Java 1.5,Hibernate 3.4.0.ga - 27 s

Oracle 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 个答案:

答案 0 :(得分:2)

Query query = em.createNativeQuery(stringQuery);

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

如果在详细说明计划之前替换参数:计划很好并且运行得非常快。

类似问题here

答案 1 :(得分:1)

您应该在oracle中更改 cursor_sharing = FORCE ,以在JPA中为Oracle启用休眠支持。

please refer to following for more details