【发布时间】:2013-03-20 17:50:11
【问题描述】:
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 服务器上调试输出的 sn-ps:
在这个问题中查询:
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
请注意,如果查询被缓存,调试输出将在调试输出中包含“Cached Query”。
另外,我确信参数没有改变。这是我用来重新加载页面的查询字符串:
?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 等)。
【问题讨论】:
-
查看 Adam Cameron 的这篇博文,看看它是否适合您的问题:Probable backwards compat bug in CF10's cachedwithin behaviour 并且根据该博客上的 cmets,CF10 中的查询缓存已更改。看到这个:Enhanced query caching using Ehcache
-
@Miguel-F:我将设置添加到 Application.cfc 文件中。它没有任何区别。每次重新加载页面时,查询始终在同一个应用程序中运行,因此它应该适用于任一设置。我正在点击一个国家、州和字母的页面;然后重新加载页面。查询应该为重新加载而缓存,但它不是。
-
您如何确定没有进行缓存?您能否更新问题以提供此信息。干杯。
-
另外请记住,对参数值或在 IF 条件中测试的值的任何更改都将导致数据的其他副本被缓存。你确定参数没有改变吗?
-
@AdamCameron:我更新了问题以显示我如何确定查询是否被缓存。另外,我确信参数没有改变。这是我用来重新加载页面的查询字符串:?PHY_NATN=US&PHY_ST=MN&vcAStart=M&vcAEnd=M&SR=1&MT=2。传递给 CFFunction 的所有参数都来自 URL。我只是重新加载页面,并且应该在第一页加载后缓存查询。
标签: coldfusion coldfusion-9 coldfusion-10