5

当您在 cfquery 中使用 cachedwithin 属性时,它如何将查询存储在内存中。它是否仅按您分配给查询的名称存储它?例如,如果在我的索引页面上我将一个查询缓存了一个小时并将其命名为 getPeople 将在不同页面(或相同页面)上使用相同名称的查询使用缓存结果还是使用更好的逻辑来决定它是否是同一个查询?

此外,如果您的查询中有一个变量,缓存是否会考虑该变量的值?

4

2 回答 2

7

这不仅是名称 - 它是您正在运行的确切查询。

<cfquery name="getPeople" cachedwithin=".5" ...>
select name from employee order by name
</cfquery>

如果您在应用程序的其他任何地方调用相同的查询,如果它在第一次查询的半天内,您将获得缓存版本。但这些将在数据库中获取新数据:

<!--- Different name, same SQL: A new cached query --->
<cfquery name="getEmployees" cachedwithin=".5" ...>
select name from employee order by name
</cfquery>

<!--- Different SQL, same name: Redefining the cached query --->
<!--- Note: As pointed out in comments, it's not really overwriting the old query
      of the same name, but making a new one in the cache. The first one by the
      same name is still in the cache, waiting for eviction. --->
<cfquery name="getPeople" cachedwithin=".5" ...>
select name from employee order by name desc
</cfquery>

是的,它确实考虑了一个变量。如果您使用cfqueryparam- 您应该这样做 - 您的数据库将缓存查询计划,但即使使用cachedwithin,从查询缓存的角度来看,每个带有更改参数的查询都将被视为不同。请注意,这意味着如果您在使用cachedwithin不同参数多次运行的查询上使用,您的查询缓存将被缓存命中率较低的查询淹没。

于 2010-06-14T19:07:18.310 回答
3

来自http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7fae.html

要使用缓存数据,当前查询必须使用相同的 SQL 语句、数据源、查询名称、用户名、密码

所以这些是“决定是否是同一个查询”的“关键”

多变的?是的,只要你使用<cfqueryparam>

于 2010-06-14T19:09:40.527 回答