【发布时间】:2012-09-07 16:18:27
【问题描述】:
在cffunction 中,我有一个查询,我想通过将cachedwitin 设置为一个大值来长缓存。但是,我也想在某些情况下清除该缓存。
我在很多地方都这样做过,但其中一个地方的缓存永远不会更新,如果我要求它给我缓存的值,我总是会得到原始值。
要使用缓存数据,当前查询必须使用相同的 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 您是否遇到上述代码(使用以下数据类型修复)没有清除缓存的问题?我已经使用这种方法很长时间了,唯一的问题是不符合“相同”标准时。