2

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 模板,该模板调用执行带有 cachedwithin 参数的查询的 CFC 函数,加载页面(记下调试信息),更改 cfc 中的查询并重新加载页面。调试部分中的查询是否随着正常的页面重新加载而改变?Ctrl-F5会改变吗?

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

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

4

2 回答 2

1

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

于 2013-03-31T12:00:26.883 回答
0

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

Select *
From tbl_data

我们防止缓存的方法是:

Select t.*
From tbl_data AS t

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

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

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

于 2013-03-24T00:41:41.313 回答