Inside a cffunction I have a query that I want to long cache by setting the cachedwitin to a big value. However, I also want to clear that cache under a few circumstances.
I’ve done this in a number of places, but in one of them the cache is never updated and I always get the original value if I ask it to give me the cached value.
The cfquery documentation states:
To use cached data, the current query must use the same SQL statement, data source, query name, user name, and password.
This is the case with the query, since it’s a single sql statement with no non-sql except the cfqueryparam; datasource and query name don’t change and username and password are not specified.
The relevant code is:
<!--- 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>
Why does this work in other places, but not here?
There is an additional “sameness” requirement for cached queries that isn’t mentioned in the documentation. That note should end with:
Change your code so that the
Arguments.UserIDis forced to a data type. In your case this can be accomplished by putting the following code before the cfquery:and change the
cfqueryparamvalue tovalue="#local.UserID#".I’ve phrased the above as an omission in the documentation, but I suspect it’s a bug in CF9 instead.