使用cachedwithin重置缓存查询

时间:2012-09-07 16:18:27

标签: coldfusion coldfusion-9

cffunction内部我通过将cachedwitin设置为较大值来查询我想要长时间缓存的查询。但是,我也想在几种情况下清除缓存。

我已经在很多地方完成了这项工作,但在其中一个地方,缓存永远不会更新,如果我要求它给我缓存值,我总是得到原始值。

cfquery documentation州:

  

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

这是查询的情况,因为它是一个没有非SQL的单个sql语句,除了cfqueryparam;数据源和查询名称不会更改,也不会指定用户名和密码。

相关代码是:

<!--- 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>

为什么这在其他地方有用,但不在这里?

1 个答案:

答案 0 :(得分: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中的一个错误。