[当您在cfquery中使用cachedwithin属性时,它如何将查询存储在内存中。它是否仅根据您分配给查询的名称来存储它?例如,如果在索引页面上我将查询缓存了一个小时,并将其命名为getPeople,则将在不同页面(或同一页面)上具有相同名称的查询使用缓存的结果还是使用了更好的逻辑确定是否是相同的查询?
此外,如果查询中有变量,缓存是否将变量的值考虑在内?
不仅是名称,而是您正在运行的确切查询。
<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
(您应该这样做),数据库将缓存query plan,但是即使使用cachedwithin
,从查询缓存的角度来看,每个具有更改参数的查询也将被视为不同。 。请注意,这意味着,如果对使用不同参数多次运行的查询使用cachedwithin
,则会用低缓存命中率的查询充斥查询缓存。
来自http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7fae.html
要使用缓存的数据,当前查询必须使用相同的SQL语句,数据来源,查询名称,用户名,密码。
所以这些是“决定是否相同的查询”的“键”
变量?是的,只要您使用<cfqueryparam>