【问题标题】:MySQL Stored Procedure calls from Grails app very slow to execute来自 Grails 应用程序的 MySQL 存储过程调用执行速度非常慢
【发布时间】:2016-09-07 04:28:27
【问题描述】:

Grails 版本:3.0.7

Groovy 版本:2.4.5

JVM 版本:1.8.0_60

最近,在 Heroku 上托管的 Grails 3.0.7 应用程序中,MySQL 中存储过程的执行时间大幅下降。不幸的是,这种情况很少发生。

有时执行时间小于 200 毫秒,但我们看到相同的存储过程有时需要超过 70,000 毫秒。这是具有相同参数的相同查询。

谁能解释一下为什么在 Grails 应用程序中会发生这种情况,或者下面显示的代码或 MySQL 存储过程中是否存在任何问题?

任何见解将不胜感激。

    Sql sql = new Sql(dataSource)
    def ids = []

    StopWatch queryStopWatch = new StopWatch('advancedSearchWithPagedResults-DD-01')
    queryStopWatch.start()

    sql.eachRow("{call findEvents(?, ?, ?)}",
            [wildcardSearch, startDate, endDate], offset, max) { row ->

        // pull out the id's into a list and later use that to get grails managed objects
        ids << row.id
    }

    queryStopWatch.stop()
    log.info(queryStopWatch.toString())

    // close of the connection
    sql.close()

还有存储过程:

BEGIN 

    SELECT DISTINCT e.*
    FROM event e
    INNER JOIN event_organiser eo on e.event_organiser_id = eo.id
    WHERE (e.event_name LIKE in_search OR e.address_town LIKE in_search OR e.address_county LIKE in_search OR eo.event_organiser_name LIKE in_search)
    AND e.start_date_time >= in_start_date
    AND e.start_date_time <= in_end_date
    AND e.enabled = true
    ORDER BY e.start_date_time;

END

【问题讨论】:

  • 据我所知,这种减速仅限于使用 MySQL 存储过程的数据库交互。重要的是,我无法在我们的本地开发环境中复制此问题,并且该问题仅存在于使用 Heroku/ClearDB 托管的登台/实时服务器上。
  • 我正在与数据库平台提供商进行谈判,希望这是一个服务问题,而不是编程问题。我会在适当的时候在这里更新。
  • 为什么不使用条件/HQL 而不是存储过程来执行此查询,因为查询非常小。我在 mysql 中使用了一个非常复杂的存储过程,其中包含 750 个 LOC,包括许多临时表,并且没有性能问题...也许连接建立和关闭需要一些时间。不要关闭连接并使用池,也许?

标签: hibernate grails


【解决方案1】:

感谢 Bernhard 的上述评论,但我几个小时前才解决了这个问题。

这是由于提供程序问题和数据库实例在共享环境中受到限制。

我在单租户计划中搬到了一个新的提供商,不仅查询执行速度显着提高,而且偶发的超时问题也有。

注意:我使用存储过程的原因是其他一些查询的复杂性。我决定使用存储过程以相同的方式实现所有查询。

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多