cfquery cachedwithin并不总是在CF 10中工作

时间:2013-03-20 17:50:12

标签: coldfusion coldfusion-9 coldfusion-10

ColdFusion 10,更新8.在Windows 2008 R2,IIS 7.5,Java 7上运行,更新17. Microsoft SQL Server 2005.最大缓存查询数:1000

以下是来自cffunction的查询:

<cfquery name="local.qryDOTCensusPubSByCCStAlpha" datasource="#variables.dsn#" cachedwithin="#CreateTimeSpan(0, 1, 0, 0)#">
SELECT
    dot.CENSUS_NUM, dot.PHY_CITY, dot.[NAME]
FROM
    tblDOTCensusPub dot
WHERE
    dot.PHY_NATN = <cfqueryparam value="#arguments.PHY_NATN#" cfsqltype="CF_SQL_VARCHAR">
    AND dot.PHY_ST = <cfqueryparam value="#arguments.PHY_ST#" cfsqltype="CF_SQL_VARCHAR">
    AND dot.cUseForTD = 'Y'
    AND NOT EXISTS (SELECT * FROM tblDOTDisabled WHERE CENSUS_NUM = dot.CENSUS_NUM)
<cfif arguments.vcAStart EQ arguments.vcAEnd>
    AND LEFT(dot.[NAME], 1) = <cfqueryparam value="#arguments.vcAStart#" cfsqltype="CF_SQL_CHAR">
<cfelseif NOT (arguments.vcAStart EQ "0" AND arguments.vcAEnd EQ "Z")>
    AND LEFT(dot.[NAME], 1) >= <cfqueryparam value="#arguments.vcAStart#" cfsqltype="CF_SQL_CHAR">
    AND LEFT(dot.[NAME], 1) <= <cfqueryparam value="#arguments.vcAEnd#" cfsqltype="CF_SQL_CHAR">
</cfif>
ORDER BY
    dot.[NAME]
</cfquery>

此查询用于处理ColdFusion 9.01中的cachedwithin参数。在ColdFusion 10中,它是否随机缓存是随机的。大多数时候它不缓存。起初我认为也许“AND NOT EXISTS(SELECT * FROM tblDOTDisabled WHERE CENSUS_NUM = dot.CENSUS_NUM)”可能会免除查询被缓存,因为该子查询的结果可能会有所不同。但是,即使我删除了该子句,查询仍然拒绝缓存。

我正在使用两台服务器;生产和发展。

生产服务器可能会获得足够的命中以清除缓存中的查询(但不是那么可能)。

开发服务器几乎没有命中,因此应该缓存此查询。

有关此查询可能无法在CF 10中缓存的任何想法?

更新
以下是ColdFusion服务器上调试输出的片段:

在这个问题中查询:

local.qryDOTCensusPubSByCCStAlpha (Datasource=tdDOTCensusPub, Time=62ms, Records=3962) in ~~~~hidden~~~~\cfc\DOTCensusPub.cfc @ 12:28:41.041

在同一页面上成功获得缓存的另一个查询:

local.qryTop5JobPosters (Datasource=truckdriver, Time=16ms, Records=5, Cached Query) in ~~~~hidden~~~~\cfc\tdJobs.cfc @ 12:28:41.041

请注意,如果缓存查询,调试输出将在调试输出中包含“缓存查询”。

另外,我确信参数不会改变。这是我用来重新加载页面的查询字符串:

?PHY_NATN=US&PHY_ST=MN&vcAStart=M&vcAEnd=M&SR=1&MT=2

传递给CFFunction的所有参数都来自URL。我只是在重新加载页面,并且应该在第一页加载后缓存查询。

更新

我刚注意到一些非常奇怪的行为。当开头和结尾字母是相同的字母时,我修改了“local.qryDOTCensusPubSByCCStAlpha”查询(也有问题更新),效率稍高一些。当我刷新页面时,调试部分显示旧查询。我必须按Ctrl-F5才能获得调试部分以显示更新的查询。当我再次按下Ctrl-F5时,它显示该查询已被缓存。所以我现在认为CF告诉浏览器页面上没有任何变化(即使调试部分DID中的查询发生了变化),浏览器也会显示包含OLD调试输出的缓存页面。使用Firebug似乎验证了这一点,因为页面返回“304 Not Modified”状态,即使调试部分应该已更改。看起来每当使用正常页面重新加载时,页面将从浏览器缓存中显示,并且没有正确的调试信息。

其他人可以验证这个吗?只需创建一个简单的cfm模板,该模板调用CFC函数,该函数使用cachedwithin参数执行查询,加载页面(记下调试信息),更改cfc中的查询并重新加载页面。调试部分中的查询是否因正常页面重新加载而更改?它是否随Ctrl-F5而改变?

我认为304状态不应该与包含调试信息的任何页面一起使用。时间和其他调试信息通常都是过时的。

注意:Ctrl-F5强制浏览器重新加载页面和所有页面对象(图像,javascript等)。

2 个答案:

答案 0 :(得分:1)

虽然我不确定,但你能说它没有超出限制最大缓存查询数:1000

答案 1 :(得分:0)

我之前实际上遇到了与此问题相反的问题。我们有一个项目可以缓存数据库结构,并在更新结构时抛出未定义的错误。 我们的问题是:

Select *
From tbl_data

我们对 阻止 缓存的修复是这样的:

Select t.*
From tbl_data AS t

我不是说这是问题的原因,我只是说它可能无法正常工作,因为您使用的是dot.Select *方法。请尝试删除dot.别名或将SELECT *更新为SELECT t.*

以下是有关此问题的更多信息:

http://www.bennadel.com/blog/194-ColdFusion-Query-Error-Value-Can-Not-Be-Converted-To-Requested-Type.htm