我想知道是否有更好的方法来做我正在做的事情。它有效,但我觉得应该有更好的方法。例如,如果我的查询结果为20K记录,我收到“请求已超过允许的时间限制标记:CFQUERY”
<cfquery name="GetMyRecords" datasource="MyDSN">
SELECT idnumber,PrefAddr,...more colums
FROM um_valid
WHERE userid = <cfqueryparam cfsqltype="cf_sql_varchar"
value="#session.userid#">
AND session_id = <cfqueryparam cfsqltype="cf_sql_numeric"
value="#session.Session_Id#">
AND status NOT IN (<cfqueryparam cfsqltype="cf_sql_varchar"
value="X,C">)
</cfquery>
我还有一个现有的存储过程,它希望查询中的某些值能够执行它应该执行的操作。所以我像这样循环:
<cfloop query="GetMyRecords">
<cfstoredproc procedure="MyProc" datasource="MyDSN">
<cfprocparam type="In" cfsqltype="CF_SQL_VARCHAR"
dbvarname="@id_number" value="#Trim(idnumber)#">
<cfprocparam type="In" cfsqltype="CF_SQL_VARCHAR"
dbvarname="@Aaddr_pref_ind" value="#Trim(PrefAddr)#">
----- still more params to be passed----
</cfstoredproc>
</cfloop>
ColdFusion有更好的技术可以避免超时错误或500错误吗?
答案 0 :(得分:1)
与上面提到的另一张海报一样,减少数据库调用次数应该是您的首要任务。我建议您在第一个查询中加入数据(如果可能),而不是循环查询并再次查询。
要解决时间问题,您可以在页面中放置requestTimeout以覆盖默认超时。时间以秒为单位。
<cfsetting requestTimeOut = "600">
答案 1 :(得分:0)
您当前的方法是进行1
查询,其中包含n
条记录。然后遍历该记录集,为每条记录调用查询。这会导致您按请求调用n + 1
个查询。随着第一个查询返回的数据量的增加,对数据库的整体查询量也会增加。在您的情况下,您尝试在单个请求中对数据库进行20,001
次调用。
理想情况下,您需要一个解决方案,该解决方案涉及使用适当优化的查询对存储过程进行一次调用,该查询可以在单个记录集中返回所有数据。如果您不需要同时将所有数据转储到页面上,则创建一个分页查询,每页将返回x
个记录数。然后,用户可以逐页浏览查询或提供带有其他过滤器的搜索表单,以允许用户减少返回的记录的总大小。
答案 2 :(得分:0)
需要查看完整查询以举例说明,但一般来说,这对CF来说非常有用,可以帮助您解决问题!
您需要查看名为group的属性。这使您可以指定一个列来对输出进行分组。这实际上将消除您完全调用的存储过程的需要。
它的工作方式是让你根据分组创建子集输出。例如,您可以使用您的ID执行此操作并输出该组。
您还可以拥有多个这些,并为每个显示目的或逻辑操作设置页眉和页脚部分。
这使您可以查询整个数据集,然后在循环中对其进行操作,而不会产生效率极低且非常有用的子查询。
这对ColdFusion来说非常独特,请查看它!
http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7ff6.html