【问题标题】:cfquery cachedwithin not always working in CF 10cfquery cachedwithin 并不总是在 CF 10 中工作
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 是的,在我的开发服务器上,我确信它没有达到这个限制。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多