2

我有一个与使用 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;
   }
4

2 回答 2

2

Query query = em.createNativeQuery(stringQuery);

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

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

类似的问题在这里

于 2013-01-31T15:25:52.467 回答
1

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

详情请参阅以下内容

于 2020-11-20T13:38:54.210 回答