当前位置: 首页 > 知识库问答 >
问题:

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

滑乐逸
2023-03-14

我有一个与使用 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个答案

夹谷岳
2023-03-14

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

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

邵畅
2023-03-14

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

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

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

类似的问题在这里

 类似资料:
  • 我正在测试简单拓扑以检查Kafka喷口的性能。它包含kafka spout和Bolt来确认每个元组。Bolt执行方法: 拓扑结构如下所示: 其他拓扑设置: 我在10分钟内得到了1.5kk元组。螺栓的性能约为0,5。所以我的逻辑很简单:如果我双倍喷注和螺栓并行提示-我将得到双倍的性能。下一个测试是1个工人2个Kafka喷口,2个简单的夹子螺栓和Topology.Acker.Executors=2。以

  • 目前正在android studio中用java进行一个项目,我正在尝试用sql查询两个表。各表如下: 预订表 User_Bookings表 用户表仅供参考 有没有一种方法可以使用UNION或INNER JOIN并仅使用用户ID连接这两个表? 例如,对于ID为2的用户,我希望从预订表中获得出发时间 还是UNION/INNER JOIN不是我试图实现的目标的正确运算符?正如我一直在尝试和复习我的SQ

  • 在我第一次使用JavaFX时,场景被错误地显示,我没有找到原因。例如,在E(fx)clipse页面的第一个基本教程中提出了以下代码: 它应该显示文本“Hello FX”,但显示以下内容: 我的Java版本是适用于Windows 64(Win 7)的8u65。

  • 译者注:该小结关于错误处理的观点,译者并不完全赞同,关于本小结的部分想法请参考关于16.10.2小节错误处理的一些见解 依附于第13章模式的描述和第17.1小节与第17.2.4小节的总结。 16.10.1 不要使用布尔值: 像下面代码一样,创建一个布尔型变量用于测试错误条件是多余的: var good bool // 测试一个错误,`good`被赋为`true`或者`false`

  • 问题内容: 我有一个python列表,说l 我想编写一个sql查询来获取列表中所有元素的数据,例如 我该如何完成? 问题答案: 到目前为止,答案一直是将这些值模板化为纯SQL字符串。这对于整数绝对没问题,但是如果我们想对字符串执行此操作,则会遇到转义问题。 这是一个使用参数化查询的变体,它对两个都适用:

  • 一进去,面试官迟到,等了近十分钟,面试官到了,开始面试 先狂问我的毕设,具体到其中的算法实现。由于算法不是自己写的,具体细节并不了解,就只能说不会,然后就被质疑是不是自己做的,在毕设中担任了什么工作,怎么具体细节都不清楚,我只能说是使用了别人做的算法包,具体实现细节不是特别清楚 之后开始正式的java坐牢环节 一上来直接问我用的jdk版本,我说了jdk8,然后居然问我为什么用jdk8。我直接一脸问

  • 问题内容: 我正在学习如何在Excel驱动的SQL查询中使用参数(实际上,我仍在学习SQL),我想更进一步,并在Excel中提供一个参数来过滤结果。 这是我的查询: 我需要做的是允许团队中的人在excel工作表中运行此查询,并在第二个JOIN中为“ GROUP_NAME”提供其组名。不幸的是,我无法使用语法(在此处找到),因为我需要从MODULE_FUNCTION表中提取所有结果,并且仅在提供的组