函数出现超时错误。有没有更有效的方法来重写这个函数?

问题描述 投票:0回答:1
coldfusion timeout cfc cffunction
1个回答
0
投票

查询很可能是罪魁祸首;您必须检查它在数据库上的执行情况,而与应用程序无关。检查索引和执行计划,看看瓶颈可能在哪里。

对于您的代码,首先我将确保使用

local
范围将查询范围限定到函数。然后,您可以使用内置函数将查询数据序列化为 JSON,但具体方式取决于您使用的 ColdFusion 版本。

<cfscript>
news = queryNew("id,title", "integer,varchar");
queryAddRow(news);
querySetCell(news, "id", "1");
querySetCell(news, "title", "Dewey Defeats Truman");
queryAddRow(news);
querySetCell(news, "id", "2");
querySetCell(news, "title", "Men walk on Moon");

writeDump(serializeJSON(news, "struct"));
</cfscript>

这将返回一个使用名称/值对的 JSON 对象数组。

[
    {
        "ID": 1,
        "TITLE": "Dewey Defeats Truman"
    },
    {
        "ID": 2,
        "TITLE": "Men walk on Moon"
    }
]

如果您为数据库列名称添加别名,则可以轻松创建 JSON 输出中指示的键。您可能需要调整读取键名称的代码以匹配函数返回的大小写。

<cffunction name="GeTheSerialNumber" access="remote" returnformat="plain" returntype="string" output="no">
    <cfargument name="term" required="yes" />

    <cfsetting requesttimeout="20"/>
    <cfif NOT IsDefined("session.LoggedIn")>
        <cfabort />
    </cfif>

    <cfquery name="local.GetSerialNumber" datasource="#application.datasource#">
        SELECT 
            [serialNum] as label
            , [serialNum] as [value]
            , MissionAsset.MissionAssetID as missionAssetID
            , MissionAssetDescription as missionAssetDescription
            , ESN.EfracusSerialNumberID as ID 
        FROM MissionAsset        
            LEFT JOIN EfracusSerialNumber ESN ON MissionAsset.MissionAssetID = ESN.MissionAssetID
        WHERE MissionAsset.isActive = <cfqueryparam value="1" cfsqltype="cf_sql_bit"> 
            AND serialNum LIKE <cfqueryparam value="%#arguments.term#%" cfsqltype="cf_sql_varchar"> 
            AND MissionAssetStatusID IN (2,3,4,5,6)
        ORDER BY serialNum
    </cfquery>

    <cfreturn serializeJSON(local.GetSerialNumber, "struct")>
</cffunction> 

如果你想要更精细的控制,你可以尝试

[ArrayCollection.cfc][1]
我为旧版本的ACF整理的。

© www.soinside.com 2019 - 2024. All rights reserved.