0

在里面cffunction我有一个查询,我想通过将 设置cachedwitin为一个大的值来长期缓存。但是,我还想在某些情况下清除该缓存。

我在很多地方都这样做了,但是在其中一个地方,缓存永远不会更新,如果我要求它给我缓存的值,我总是会得到原始值。

cfquery 文档指出:

要使用缓存数据,当前查询必须使用相同的 SQL 语句、数据源、查询名称、用户名和密码。

cfqueryparam查询就是这种情况,因为它是一条 sql 语句,除了;之外没有非 sql 语句。数据源和查询名称不变,用户名和密码未指定。

相关代码为:

<!--- Long cache the query since the values rarely change, but allow the cache to be cleared. --->
<cfif Arguments.ClearCache EQ false>
    <cfset local.CachedWithin = CreateTimeSpan(7,0,0,0)>
<cfelse>
    <cfset local.CachedWithin = CreateTimeSpan(0,0,0,-1)>
</cfif>

<cfquery name="local.qryName" datasource="#Variables.DSN#" cachedwithin="#local.CachedWithin#">
    SELECT
        [User].[Name]
    FROM
        [User]
    WHERE
        [User].[UserID] = <cfqueryparam value="#Arguments.UserID#" cfsqltype="cf_sql_integer">
</cfquery>

为什么这在其他地方有效,而在这里却不行?

4

1 回答 1

1

对于文档中未提及的缓存查询还有一个额外的“相同性”要求。该说明应以以下结尾:

...密码和任何 cfqueryparam 值的基础数据类型。

更改您的代码,以便Arguments.UserID强制为数据类型。在您的情况下,这可以通过将以下代码放在 cfquery 之前来完成:

<!--- Make sure data types used in query are consistent --->
<cfset local.UserID = Int(Arguments.UserID)>

并将cfqueryparam值更改为value="#local.UserID#"

我已将上述内容表述为文档中的一个遗漏,但我怀疑这是 CF9 中的一个错误。

于 2012-09-07T16:18:27.497 回答