gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:11:19 25 4
gpt4 key购买 nike

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

请求已超过允许的时间限制标签: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com