CF 10和CF 2016之间的缓存查询行为会发生变化

时间:2017-05-31 21:43:25

标签: coldfusion

我正在从Adobe CF10升级到CF2016,并注意到在CF2016中对缓存查询对象的修改似乎会持久化回缓存。这在CF10中似乎并非如此。

例如:

<cfquery datasource="myDs" name="rs" cachedwithin="#createtimespan(0,0,5,0)#">
    SELECT 10 AS value
</cfquery>

<cfset rs.value = 2016>

<cfquery datasource="myDs" name="rs" cachedwithin="#createtimespan(0,0,5,0)#">
    SELECT 10 AS value
</cfquery>

<!--- CF10 outputs 10 --->
<!--- CF2016 outputs 2016 --->
<cfoutput>#rs.value#</cfoutput>

我在这里误解了什么吗?我无法在任何地方找到这个记录。 RTFM欢迎。

1 个答案:

答案 0 :(得分:5)

让我们定义一个查询对象,将其命名为variables.rs并将其放入缓存中。

<cfquery datasource="myDs" name="rs" cachedwithin="#createtimespan(0,0,5,0)#">
    SELECT 10 AS value
</cfquery>

此查询对象包含一个记录和一列(名为value)。如果我们输出这一个记录列的值(引用为variables.rs.value),我们会看到10的值。

现在,让我们定义一个名为struct的{​​{1}},其中一个键名为variables.rs,值为value。如果我们输出此值(引用为2016),我们会看到variables.rs.value的值。

最后,让我们再次运行该查询。

2016

但查询是在<cfquery datasource="myDs" name="rs" cachedwithin="#createtimespan(0,0,5,0)#"> SELECT 10 AS value </cfquery>的时间内运行的,并且记录集从未更改过,因此无需更新查询缓存。因此,变量cachedwithin将不会更新。

这会将variables.rs保留为结构,其名称为variables.rs,其值为value

这似乎是应该发生的事件的正确进展。这可能是以前版本中的一个错误,导致它们像他们一样行事,这在2016年已经修复(是的!?)。

很可能no one has created a bug report通过重新创建步骤概述了这个确切的问题,因此,CF开发团队不知道这是一件事。

但是,你可能更容易重构代码而不是屏住呼吸等待问题被分类,接受,修复和释放。但你至少可以试一试。我的公司在2016年和之前的版本之间已经提交了许多重大变化,并且大多数(如果不是全部)修复了。