【问题标题】:Resetting cached query with cachedwithin使用 cachedwithin 重置缓存查询
【发布时间】:2012-09-07 16:18:27
【问题描述】:

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

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

cfquery documentation 声明:

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

查询就是这种情况,因为它是一个单独的 sql 语句,除了 cfqueryparam; 之外没有非 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>

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

【问题讨论】:

  • Coldfusion 处理缓存持续时间的方式很奇怪。通常缓存 CreateTimeSpan(0,0,0,0) 的值(或者可能更少)绝对没有任何作用。人们会期望它不会缓存查询或从缓存中清除查询,但这就是它的作用。
  • @Nucleon 您是否遇到上述代码(使用以下数据类型修复)没有清除缓存的问题?我已经使用这种方法很长时间了,唯一的问题是不符合“相同”标准时。

标签: coldfusion coldfusion-9


【解决方案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 中的错误。

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 2012-04-28
    • 1970-01-01
    • 2013-05-13
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多