在cffunction
内部我通过将cachedwitin
设置为较大值来查询我想要长时间缓存的查询。但是,我也想在几种情况下清除缓存。
我已经在很多地方完成了这项工作,但在其中一个地方,缓存永远不会更新,如果我要求它给我缓存值,我总是得到原始值。
要使用缓存数据,当前查询必须使用相同的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>
为什么这在其他地方有用,但不在这里?
答案 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中的一个错误。