2010-06-14 16 views
5

Lorsque vous utilisez l'attribut cachedwithin dans une requête cfquery, comment stocke-t-il la requête en mémoire. Le stocke-t-il seulement par le nom que vous attribuez à la requête? Par exemple, si sur ma page d'index je cache une requête pendant une heure et la nomme getPeople une requête avec le même nom sur une page différente (ou la même page d'ailleurs) utilise les résultats mis en cache ou utilise-t-elle une meilleure logique décider si c'est la même requête?Utilisation de cachedwithin attibute dans cfquery

De même, s'il y a une variable dans votre requête, le cache prend-il en compte la valeur de la variable?

Répondre

5

Ce n'est pas seulement le nom, c'est la requête exacte que vous exécutez.

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

Si vous invoquez cette même requête nulle part ailleurs dans votre application, vous obtiendrez la version en cache si elle est dans un demi-jour de la première requête. Mais ceux-ci frappera la base de données pour les données fraîches:

<!--- 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> 

Et oui, il ne prend une variable en compte. Si vous utilisez cfqueryparam - ce que vous devriez faire - votre base de données mettra en cache le plan de requête , mais même en utilisant cachedwithin, chaque requête avec un paramètre modifié sera traitée différemment d'une perspective de mise en cache de requête. Notez que cela signifie que si vous utilisez cachedwithin sur une requête qui s'exécute plusieurs fois avec des paramètres différents, vous inonderez votre cache de requêtes avec des requêtes qui ont des taux de réussite de cache bas.

+0

alors ce que vous dites est que le jeu de résultats 2nd getPeople remplacerait le premier jeu de résultats getPeople? – Jason

+0

plan de requête de cache? vraiment? – Henry

+0

@Jason, selon le doc, non, puisque l'instruction SQL est différente bien qu'ils aient le même nom de requête. – Henry