mysql - 请求已超过 CFQUERY 标记允许的时间限制错误

标签 mysql coldfusion jvm cfquery

我最近开始收到这个错误:

请求已超过允许的时间限制标签:CFQUERY

似乎每当 Bing 机器人访问我的网站时。我在 5 分钟内收到有关错误的系统通知。所以我会连续得到 7 到 10 个。错误都指向一个查询:

    <CFQUERY DATASOURCE="#datasource#" USERNAME="#username#" PASSWORD="#password#" NAME="queryname" CACHEDWITHIN="#CreateTimeSpan(0,0,2,0)#">
    SELECT products.field1, products.field2, products.field3, products.field4, products.field5, products.field6, products.field7, products.field8, products.field9, products.field10, products.field11, company.field1, company.field2, company.field3, company.field4, company.field5, company.field6, company.field7
    FROM products JOIN company
    ON products.field1 = company.field1
        WHERE products.field12 = <cfqueryparam value = "#catd#" cfsqltype = "cf_sql_integer" maxLength = "2">
        ORDER by products.field13 DESC
    </CFQUERY>

它基本上是选择一个类别中的所有产品,并获取与之关联的公司信息并对它们进行分页。每个类别返回的结果范围从 2K 到 30K 条记录。最多有 30 个类别。

出现的错误如下所示:

The request has exceeded the allowable time limit Tag: CFQUERY  <br>The error occurred on line 152.
Query: cat=18&page=1803
The request has exceeded the allowable time limit Tag: CFQUERY  <br>The error occurred on line 152.
Query: cat=2&page=211
The request has exceeded the allowable time limit Tag: CFQUERY  <br>The error occurred on line 152.
Query: cat=7&page=691
The request has exceeded the allowable time limit Tag: CFQUERY  <br>The error occurred on line 152.
Query: cat=6&page=451
The request has exceeded the allowable time limit Tag: CFQUERY  <br>The error occurred on line 152.
Query: cat=14&page=417

这表明 Bing 机器人同时访问网站的不同类别和页面的多个部分。

两周前我得到了

The request has exceeded the allowable time limit Tag: CFQUERY   

GC overhead limit exceeded null

所以我将 JVM 内存从 1024 增加到 2048。但这可能只是暂时解决了这个问题。现在两周后,“超过允许的时间限制”错误又回来了。

这个问题可能是由 Bing bot 引起的,还是与我的代码、服务器内存或 CF 设置有关?

提前致谢。

最佳答案

如果您每页只显示 20 条记录,那么您的查询每次请求应该只返回 20 条记录。您宁愿让机器人索引 200 个页面,每个页面有 20 条记录,也不愿在单个页面上触发超时,这会对您的应用程序的其余部分和全天的实时客户端产生性能影响。

调用FOUND_ROWS()将返回与您的查询匹配的记录总数。您可以使用它来创建页面链接。

<cfparam name="url.p" type="numeric" default="1">
<cfset queryLimit = 20>
<cfset queryOffset = 0>
<cfif url.p GT 1>
    <cfset queryOffset = p * queryLimit>
</cfif>

<CFQUERY NAME="queryname" ...>
    SELECT 
        products.field1
        , products.field2
        , products.field3
        , products.field4
        , products.field5
        -- etc.
        , FOUND_ROWS() as total_rows
    FROM 
        products 
    INNER JOIN 
        company ON products.field1 = company.field1
    WHERE 
        products.field12 = <cfqueryparam value = "#catd#" cfsqltype = "cf_sql_integer" maxLength = "2">
    ORDER BY 
        products.field13 DESC
    LIMIT #queryLimit# 
    OFFSET #queryOffset#
</CFQUERY>

更新 2017-11-07

在更好地阅读 FOUND_ROWS() 的文档之后,我认为它的工作方式类似于 SQL Server 中的相关函数的假设是不正确的。你需要做这样的事情。也许你可以运行两个 select单个语句 <cfquery> ,但我不确定这是否会为单个查询名称变量返回两个查询对象。

<CFQUERY NAME="queryname" ...>
    SELECT 
        SQL_CALC_FOUND_ROWS
        , products.field1
        , ...
    LIMIT #queryLimit# 
    OFFSET #queryOffset#
</CFQUERY>
<CFQUERY NAME="foundRows" ...>
    SELECT FOUND_ROWS() as totalCount;
</CFQUERY>

关于mysql - 请求已超过 CFQUERY 标记允许的时间限制错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45899979/

相关文章:

Java 服务器应用程序闲置一段时间后速度变慢 (Windows)

php - 全文 bool 搜索停用词返回空结果

mysql - Javascript 中的 PHP 代码 - 如何传递变量

java - 有时连接 MySQL 时出现问题

ColdFusion 结构一次初始化多个属性

java - 为什么要定义Java内存模型?

java - 如何使用 Inline::Java 连接到外部 JVM?

mysql - 从外部主机获取动态数据 - 建立 mysql 连接或通过curl获取数据?

coldfusion - 如何以编程方式清理 ColdFusion cfquery 参数?

oracle - 使用 Coldfusion 设置 Oracle 时间戳